Swift – 保存在TableView中选中的复选标记

我对Swift相当陌生,而且我在TableView多选中遇到问题。 我有多个select,我可以检查一个复选标记,类似于待办事项列表。

当我检查项目,我希望能够回到ListView,并保存我的select。 我假设保持这个保存状态的代码会在这里的某个地方? 这是写入单个单元格项复选标记的类:

class ListItem: NSObject { let itemName: String var completed: Bool init(itemName: String, completed: Bool = false) { self.itemName = itemName self.completed = completed } } 

有人可以告诉我如何去做这个?

这是cellForRowAtIndexPath

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let tempCell = tableView.dequeueReusableCellWithIdentifier("ListPrototypeCell") as UITableViewCell let listItem = listItems[indexPath.row] // Downcast from UILabel? to UILabel let cell = tempCell.textLabel as UILabel! cell.text = listItem.itemName if (listItem.completed) { tempCell.accessoryType = UITableViewCellAccessoryType.Checkmark; } else { tempCell.accessoryType = UITableViewCellAccessoryType.None; } return tempCell } 

和我的didSelectRowAtIndexPath

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: false) let tappedItem = listItems[indexPath.row] as ListItem tappedItem.completed = !tappedItem.completed tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None) } 

两件事情:

你在cellForRowAtIndexPath:代码是完美的。 它从listItems[indexPath.row]的信息填充您的单元格的文本和复选标记。 但是,在你的didSelectRowAtIndexPath: ,你永远不会改变listItems ,使得cellForRowAtIndexPath:在重新加载时有更新的数据从中拉出新行。 因此,而不是使用deselectRowAtIndexPath: reloadRowsAtIndexPaths只需更新listItems数组然后reloadRowsAtIndexPaths 。 (老实说,我很困惑,为什么它是为你工作,直到这一点,因为你打电话重新加载未更新的数据。)这是我推荐的:

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let tappedItem = listItems[indexPath.row] as ListItem tappedItem.completed = !tappedItem.completed // Store the updated tappedItem back at the listItems index listItems[indexPath.row] = tappedItem tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None) } 

其次,只要该数组存储在未被释放的视图控制器中,您将不会丢失该数据,并且可以重新填充该表。 但是,如果将其存储在视图控制器(或表视图控制器)中,那么您可能希望将其存储在程序中的其他位置。

我认为你有一个ListItem数组表示模型数据(表视图的内容)。 然后为了保存这个运行的应用程序外面,你可以把它保存到NSUserDefaults或文件。 为此,您需要序列化一个ListItem的方法。 通常的做法是让ListItem采用NSCoding协议并实现encodeWithCoder:init(coder:)以使用NSKeyedArchiver和NSKeyedUnarchiver(这些方法中的“编码器”)将ListItem对象转换为NSData, 反之亦然 。 一旦你完成了,一个ListItem数组可以直接与NSKeyedArchiver和NSKeyedUnarchiver序列化。

解决了这个混合,并匹配了一下,使用NSUserDefaults在这里:

在我popup的Table / ListView的导航栏中创build一个button,以及button的function:

  //create a done button in the navigation bar var done = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: Selector("doneBtn")) self.navigationItem.rightBarButtonItem = done } //This is the "Done" button functionality func doneBtn() { var saveString = "" for var i=0; i<listItems.count; i++ { let listItem = listItems[i] if (listItem.completed) { saveString = saveString + " " + "\(i)" } } saveString = saveString.stringByTrimmingCharactersInSet(NSCharacterSet .whitespaceAndNewlineCharacterSet()) NSUserDefaults.standardUserDefaults().setValue(saveString, forKey: "savedValues") NSUserDefaults.standardUserDefaults().synchronize() self.navigationController?.dismissViewControllerAnimated(true, completion: nil) } 

然后在我的func加载最初的数据数组,其中包含我的列表项,创build一个variablessavedValues看起来像这样:

  var savedValues : String? = NSUserDefaults.standardUserDefaults().valueForKey("savedValues") as? String if(!(savedValues==nil)) { var nsStr: NSString = savedValues! let array = nsStr.componentsSeparatedByString(" "); for val in array { listItems[val.integerValue].completed = true } } 

自然,不要忘记在你的viewDidLoad()调用loadInitialData() viewDidLoad()

感谢所有帮助我的人:)

    Interesting Posts