使用NSUserDefaults持久保留UITableView选定单元格的UIAccessoryType

时间:2014-03-31 21:55:13

标签: ios iphone nsuserdefaults uitableview

关于这个主题有很多问题,我已经尝试了几个小时的各种选项,但我需要一些真正的帮助。

主要前提是:我有Tab Bar controller有两个标签;第一个是Timeline,第二个是In-App Settingstable view controllers)。在In-App settings中,当我选择"键盘"时,我通过带有两个静态单元格的光线进入另一个表格视图:光明和黑暗。

我想要实现的是:当我点击其中一个单元格时,它会在checkmark accessory上放置cell视图。

使用NSUserDefaults,我想维护所选的单元格并设置该单元格' accessoryType用于勾选下一个视图重新加载。

我按照这个问题'选择答案,而我的代码允许我选择Light或Dark单元格;它从不保持在重新加载之间。

这是我的cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];    
    self.selectedKeyboardCell = [[NSUserDefaults standardUserDefaults] objectForKey:@"Selected"];

    NSLog(@"The selected keyboard is %@", self.selectedKeyboardCell);

    if([self.checkedIndexPath isEqual:indexPath])
    {
        NSLog(@"Loaded");
        cell.accessoryType = UITableViewCellAccessoryCheckmark;

    }
    else
    {
        NSLog(@"Not Loaded");

        cell.accessoryType = UITableViewCellAccessoryNone;
        /*if ([self.selectedKeyboardCell isEqualToString:@"Light"])
        {
            NSLog(@"P");
            if (indexPath.row == 0)
            {
                NSLog(@"Q");
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }
            cell.accessoryType = UITableViewCellAccessoryNone;

        }
        else
        {
            NSLog(@"R");
            if (indexPath.row == 1)
            {
                NSLog(@"Z");
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }
            cell.accessoryType = UITableViewCellAccessoryNone;
*/

    }

我的didSelectRowAtIndexPath是:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Uncheck the previous checked row
    if(self.checkedIndexPath)
    {
        UITableViewCell* uncheckCell = [tableView
                                        cellForRowAtIndexPath:self.checkedIndexPath];
        uncheckCell.accessoryType = UITableViewCellAccessoryNone;
    }
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    self.checkedIndexPath = indexPath;

    self.selectedKeyboardCell = cell.textLabel.text;

    [[NSUserDefaults standardUserDefaults] setObject:self.selectedKeyboardCell forKey:@"Selected"];

    self.selectedKeyboardTheme = cell.textLabel.text;

    [tableView deselectRowAtIndexPath:indexPath animated:YES];


    [[NSUserDefaults standardUserDefaults] setObject:self.selectedKeyboardTheme forKey:@"Keyboard"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

我的[self.keyboardTableView reloadData];中有一个viewWillAppear

我已经注释了一些我一直在尝试的代码,但不管我读了多少帖子,我都找不到解决方案。

这个问题谈到将代码转移到viewWillAppear,但我不知道他说的是什么代码:Ho to refresh view and tableview, and checkmark a default setting cell on load?

问题:我想在表视图中选择一个单元格,并在下次(并且每次加载此视图时)使用复选标记附件类型选择该单元格。它是一个静态表,文本只能说是光明或黑暗。

cellForRowAtIndexPath中,self.selectedKeyboardCell准确地告诉我它是亮还是暗,具体取决于在加载视图之前选择了哪个单元格。但是,我怎么说"如果Light,请在FIRST单元格上设置复选标记并从第二个单元格中删除复选标记,如果为Dark,则在SECOND单元格上设置复选标记并从第一个单元格中删除复选标记" 。

更新: 为清楚起见,我可以选择Light或Dark静态表视图单元格,无论选择哪个单元格,都会正确显示复选标记。问题是当我转到另一个视图并返回到此视图时,先前选择的单元格不显示。我已将selectedCell的textLabel保存到NSUserDefaults,在NSLog中,它会显示所选单元格的文本,但它不会显示我的复选标记选定的单元格。

更新二: 为了在第一次运行应用程序时将默认选定的单元格设置为Light,我在cellForRowAtIndexPath中执行了以下操作:

if (!self.selectedKeyboardCell)
{
    self.checkedIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}

对此的任何指导都将受到重视。

1 个答案:

答案 0 :(得分:1)

老实说,你的代码有点令人困惑,如果你多说了一些实际有用的东西,它会有所帮助。但是:

viewWillAppear中,您应该设置self.checkedIndexPath

if ([self.selectedKeyboardCell isEqualToString:@"Light"])
{
   self.checkedIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
}else{
   self.checkedIndexPath = [NSIndexPath indexPathForRow:1 inSection:0];
}
[self.keyboardTableView reloadData];

正确?