Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中从tableview中删除单元格后设置正确的uibutton状态_Ios_Uitableview_Swift - Fatal编程技术网

Ios 在Swift中从tableview中删除单元格后设置正确的uibutton状态

Ios 在Swift中从tableview中删除单元格后设置正确的uibutton状态,ios,uitableview,swift,Ios,Uitableview,Swift,我是斯威夫特的新手,我很难对这个特殊的问题保持清醒的头脑。因此,如果我不能立即传达这一点,请耐心一点。;-)谢谢 基本上,我有一个类似于UITable中的待办事项列表。单元格中有一个UIButtons(带有自定义类)作为“复选框”。我将按钮状态存储在字典中,如下所示: var buttonState = [listItem1 : true, listItem2 : false, ...] 字典还存储在NSUserDefaults中。这一切都很好。我的问题是,当我使用UITableViewCel

我是斯威夫特的新手,我很难对这个特殊的问题保持清醒的头脑。因此,如果我不能立即传达这一点,请耐心一点。;-)谢谢

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

var buttonState = [listItem1 : true, listItem2 : false, ...]
字典还存储在
NSUserDefaults
中。这一切都很好。我的问题是,当我使用
UITableViewCellEditingStyle.delete
函数删除单元格并在使用
self.tableView.reloadData()
后重新加载表格时,按钮状态出现错误。在上面的示例中,如果我删除了listitem1,listItem2将显示为true。事实上,存储的值仍然是false。我想这一定和Indexath有关

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

在删除一个tablecell后,如何在不重新加载整个屏幕的情况下获得正确的按钮状态

希望所有这些都有道理!;-)

//赛博

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()

    }
}
override func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
让cell=tableView.dequeueReusableCellWithIdentifier(“CellItem”,forIndexPath:indexPath)作为customCell
//用标签标识按钮
cell.checkbox.tag=indexPath.row
//设置标签
开关indexPath.section{
案例0:
cell.textlab?.text=“\(kleidung[indexPath.row])”
案例1:
cell.textLabel?.text=“\(卫生[indexPath.row])”
违约:
单元格.textLabel?.text=nil
}
//设置单元状态
cell.onLoadSet()
返回单元
}
//删除表行
重写func tableView(tableView:UITableView,CommittedItingStyle editingStyle:UITableViewCellEditingStyle,forRowAtIndexPath indexPath:NSIndexPath){
if(editingStyle==UITableViewCellEditingStyle.Delete){
if(indexPath.section==0){
removateIndex(indexPath.row)
让fixedPackItems=“,”.join(kleidung)
packlisten![rowCount].setValue(“\(fixedPackItems)”,forKey:“kleidung”)
}else if(indexPath.section==1){
healthy.removatendex(indexPath.row)
让fixedPackItems=“,”。加入(卫生)
packlisten![rowCount].setValue(“\(fixedPackItems)”,forKey:“卫生学”)
}
context.save(无)
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
var itemString=storedToDoItems作为字典
state=itemString!
println(itemString)
}
让currentCell=tableView.CellForRowatineXpath(indexPath)作为UITableViewCell!
标识符=“\(currentCell.textLabel!.text!)\(行数)”
状态[标识符]=nil
println(州)
让checkedItems=状态为字典
NSUserDefaults.standardUserDefaults().setObject(checkedItems,forKey:“packItems”)
NSUserDefaults.standardUserDefaults().synchronize()
self.packlisteTable.reloadData()
}
}
在customCell类中:

@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!
            }
        }
    }

}
@IBAction func checkboxButton(发件人:复选框){
//更改按钮状态
如果sender.isChecked==true{
sender.isChecked=false
}否则{
sender.isChecked=true
}
//检索存储状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
var itemString=storedToDoItems作为字典
如果itemString!=nil{
state=itemString!
}
}
//将新状态添加到存储的
标识符=“\(textlab!.text!)\(行数)”
状态[标识符]=发送方。已检查
//存储状态
让checkedItems=状态为字典
NSUserDefaults.standardUserDefaults().setObject(checkedItems,forKey:“packItems”)
NSUserDefaults.standardUserDefaults().synchronize()
}
func onLoadSet(){
标识符=“\(textlab!.text!)\(行数)”
//从存储状态设置状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
如果storedToDoItems!=无{
var itemString=storedToDoItems作为字典
如果itemString![identifier]!=nil{
checkbox.isChecked=itemString![identifier]作为Bool!
}
}
}
}

好的,我找到了。令人难以置信的是,这最终是多么简单

我刚刚添加了一个else语句:

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 onload集(){
标识符=“\(textlab!.text!)\(行数)”
//从存储状态设置状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
如果storedToDoItems!=无{
var itemString=storedToDoItems作为字典
如果itemString![identifier]!=nil{
checkbox.isChecked=itemString![identifier]作为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
            }
        }
    }

}
func onload集(){
标识符=“\(textlab!.text!)\(行数)”
//从存储状态设置状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
如果storedToDoItems!=无{
println(存储项)
var itemString=storedToDoItems作为字典
如果itemString![identifier]!=nil{
checkbox.isChecked=itemString![identifier]作为Bool!
}否则{
checkbox.isChecked=false
}
}
}
}

能否显示
的代码-tableView:cel