装载电池' NSUserDefaults的附件状态

时间:2014-10-26 09:23:16

标签: ios xcode uitableview cell

这就是我当前正在保存单元格选中标记的状态(有效):

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {\

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

NSUserDefaults  *defaults = [NSUserDefaults standardUserDefaults];
if (cell.accessoryType == UITableViewCellAccessoryNone) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    [defaults setBool:YES forKey:cell.textLabel.text];

} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
    [defaults setBool:NO forKey:cell.textLabel.text];
}
[defaults synchronize];

}

这就是我试图检索它们的方式:

-(void)viewWillAppear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

for (int section = 0; section < [self.tableView numberOfSections]; section++) {
    for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++) {
        NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section];
        UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath];
        if (![defaults valueForKey:cell.textLabel.text]) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
    }
}
}

NSUser默认值正确保存(我知道这是因为NSLog),但当我退出并返回到表视图时,没有单元格有复选标记。

如果我改变了行:

if (![defaults valueForKey:cell.textLabel.text]) {

if ([defaults valueForKey:cell.textLabel.text]) {

表格视图重新出现,所有单元格都有复选标记。

由于

1 个答案:

答案 0 :(得分:0)

你的问题是[self.tableView cellForRowAtIndexPath:cellPath];如果表格中当前没有该单元格的单元格,则可以返回nil - 这在viewDidLoad几乎可以肯定是因为视图还不可见。即使表已加载,如果单元格已滚出视图且单元格对象已被释放或重用,该方法仍可返回nil。

您最好将选择状态存储在NSMutableDictionary中并将字典存储在NSUserDefaults中。然后,您可以在cellForRowAtIndexPath中检查字典的内容,并相应地设置附件。