这就是我当前正在保存单元格选中标记的状态(有效):
-(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]) {
表格视图重新出现,所有单元格都有复选标记。
由于
答案 0 :(得分:0)
你的问题是[self.tableView cellForRowAtIndexPath:cellPath];
如果表格中当前没有该单元格的单元格,则可以返回nil - 这在viewDidLoad
几乎可以肯定是因为视图还不可见。即使表已加载,如果单元格已滚出视图且单元格对象已被释放或重用,该方法仍可返回nil。
您最好将选择状态存储在NSMutableDictionary中并将字典存储在NSUserDefaults
中。然后,您可以在cellForRowAtIndexPath
中检查字典的内容,并相应地设置附件。