你好我有两个自定义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;
}
你可以看到我保存NSUserDefaults中用户的选择,这是xib的名称,但是当我返回我的视图时,单元格视图没有改变,我必须退出应用程序,关闭来自后台的应用程序,并重新打开它,以及它加载的新视图,所以有一种方法可以在不退出应用程序的情况下重新加载我的视图?
答案 0 :(得分:2)
因此,NSUserDefaults的工作方式是即使你使用setValue:forKey :(或其他一个setter方法之一),它实际上也不会立即被写出来。操作系统尝试通过仅在一段时间之后,当应用程序退出等时优化保存该plist。在此之前,您设置的值只是缓存以防止操作系统不必打开和关闭数据库无数次。因此,当您尝试获取单元格的值时,它将转到数据库并检索可能是旧值的数据。当您退出应用程序时,NSUserDefaults会写出您设置的新值,当您回来时,您将获得正确的值。
要“强制”NSUserDefaults立即写入数据库,请在根据用户输入设置值后立即尝试调用synchronize
。这将写入数据库,所以当你调用valueForKey:方法时,你应该得到正确的东西。
更新: 我还会重构此方法的逻辑流程。首先,如果要从两个不同的nib卸载两个单元,则需要两个不同的重用标识符。否则你的tableview正在寻找cell1,以便在它真正需要cell2时重用。尝试这样的事情:
- (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;
}
}
}
}