我是 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
}
}
}
}