在 Swift 中从表格视图中删除单元格后设置正确的 uibutton 状态



我是 Swift 的新手,我很难解决这个特定的问题。因此,如果我不能立即传达这一点,请耐心等待。;-)感谢!

基本上,我在UITable中有一种待办事项列表。这些单元格有一个UIButtons(带有自定义类)作为"复选框"。我将按钮状态存储在字典中,如下所示:

var buttonState = [listItem1 : true, listItem2 : false, ...]

字典也存储到 NSUserDefaults .这一切都工作正常。我的问题是,当我使用 UITableViewCellEditingStyle.Delete 函数删除单元格并在使用 self.tableView.reloadData() 后重新加载表格时,按钮状态出错。在上面的例子中,如果我删除了listitem1,listItem2将显示为true。事实上,存储的值仍然是假的。我想这一定与索引路径有关。

注意:我确实在self.tableView.reloadData()之前更新了词典buttonState[listItem1] = nil。这意味着我确实为字典中的每个列表项提供了正确的值。此外,如果我完全重新加载视图(即返回模拟器中的一个屏幕并从头开始重新加载列表),则所有按钮状态都会正确出现。

如何在删除表格单元格后立即获得正确的按钮状态,而无需重新加载整个屏幕?

希望所有这些都以某种方式有意义! ;-)

/

/塞布

UITableView 中的相关代码:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CellItem", forIndexPath: indexPath) as customCell
    //Identify Button with Tag
    cell.checkbox.tag = indexPath.row
    // Set Label
    switch indexPath.section{
    case 0:
        cell.textLabel?.text = "(kleidung[indexPath.row])"
    case 1:
        cell.textLabel?.text = "(hygiene[indexPath.row])"
    default:
        cell.textLabel?.text = nil
    }
    // Set Cell State
    cell.onLoadSet()
    return cell
}

// DELETE TABLE ROW
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){
    if (editingStyle == UITableViewCellEditingStyle.Delete){
        if (indexPath.section == 0) {
            kleidung.removeAtIndex(indexPath.row)
            let fixedPackItems = ",".join(kleidung)
            packlisten![rowCount].setValue("(fixedPackItems)", forKey: "kleidung")
        } else if (indexPath.section == 1) {
            hygiene.removeAtIndex(indexPath.row)
            let fixedPackItems = ",".join(hygiene)
            packlisten![rowCount].setValue("(fixedPackItems)", forKey: "hygiene")
        }
        context.save(nil)
        if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
            var itemString = storedToDoItems as? Dictionary<String, Bool>
            state = itemString!
            println(itemString)
        }
        let currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!
        identifier = "(currentCell.textLabel!.text!)(rowCount)"
        state[identifier] = nil
        println(state)
        let checkedItems = state as Dictionary
        NSUserDefaults.standardUserDefaults().setObject(checkedItems, forKey: "packItems")
        NSUserDefaults.standardUserDefaults().synchronize()
        self.packlisteTable.reloadData()
    }
}

在自定义单元格类中:

@IBAction func checkboxButton(sender: CheckBox) {
    // Change Button State
    if sender.isChecked == true {
        sender.isChecked = false
    }else{
        sender.isChecked = true
    }
    //Retrieve stored state
    if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
        var itemString = storedToDoItems as? Dictionary<String, Bool>
        if itemString != nil {
            state = itemString!
        }
    }
    //Add new State to Stored
    identifier = "(textLabel!.text!)(rowCount)"
        state[identifier] = sender.isChecked
    //Store state
    let checkedItems = state as Dictionary
    NSUserDefaults.standardUserDefaults().setObject(checkedItems, forKey: "packItems")
    NSUserDefaults.standardUserDefaults().synchronize()
}
func onLoadSet(){
    identifier = "(textLabel!.text!)(rowCount)"
    //Set state from stored State
    if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
        if storedToDoItems != nil {
           var itemString = storedToDoItems as? Dictionary<String, Bool>
            if itemString![identifier] != nil {
                checkbox.isChecked = itemString![identifier] as Bool!
            }
        }
    }
}

好的,我找到了。难以置信,最后是多么简单!

我只是在以下位置中添加了一个 else sat:

func onLoadSet(){
identifier = "(textLabel!.text!)(rowCount)"
//Set state from stored State
if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
    if storedToDoItems != nil {
       var itemString = storedToDoItems as? Dictionary<String, Bool>
        if itemString![identifier] != nil {
            checkbox.isChecked = itemString![identifier] as Bool!
        }
    }
}

工作代码:

func onLoadSet(){
    identifier = "(textLabel!.text!)(rowCount)"
    //Set state from stored State
    if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
        if storedToDoItems != nil {
            println(storedToDoItems)
           var itemString = storedToDoItems as? Dictionary<String, Bool>
            if itemString![identifier] != nil {
                checkbox.isChecked = itemString![identifier] as Bool!
            } else {
                checkbox.isChecked = false
            }
        }
    }
}

最新更新