0

您好,我有两个自定义 UITableViewCell 笔尖,我让用户可以选择在设置中选择什么类型的笔尖,我以这种方式初始化自定义视图单元:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"MasterViewCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:[[NSUserDefaults standardUserDefaults] valueForKey:@"CustomCellViewKey"] owner:self options:nil];

    cell = customCell;
    self.customCell = nil;

}

 return cell;
}

如您所见,我将用户的选择保存在作为 xib 名称的 NSUserDefaults 中,但是当我返回视图时,单元格视图没有更改,我必须退出应用程序,关闭应用程序背景,然后重新打开它,以及它加载的新视图,所以有一种方法可以在不退出应用程序的情况下重新加载我的视图?

4

1 回答 1

2

因此,NSUserDefaults 的工作方式是,即使您使用 setValue:forKey: (或其他 setter 便利方法之一),它实际上也不会立即被写出。操作系统尝试通过仅在一段时间后、应用程序退出等时才这样做来优化该 plist 的保存。在此之前,您设置的值只是被缓存以防止操作系统必须打开和关闭数据库无数次。因此,当您尝试获取单元格的值时,它会进入数据库并检索可能是旧值的值。当你退出应用程序时,NSUserDefaults 会写出你设置的新值,当你回来时,你会得到正确的值。

要“强制” NSUserDefaults 立即写入数据库,请尝试synchronize在根据用户输入设置值后立即调用。这将写入数据库,所以当你调用你的 valueForKey: 方法时,你应该得到正确的东西。

更新:我还将重组此方法的逻辑流程。首先,如果您从两个不同的 nib 中卸载两个单元,它们需要两个不同的重用标识符。否则,您的 tableview 会在真正需要 cell2 时寻找 cell1 以重用。尝试这样的事情:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *nibName = [[NSUserDefaults standardUserDefaults] valueForKey:@"CustomCellViewKey"];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nibName];

    if (!cell) {
        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
        for (id obj in nibArray) {
            if ([obj isKindOfClass:[UITableViewCell class]]) {
                cell = obj;
                break;
            }
        }
    }
}
于 2012-04-21T23:18:12.523 回答