在运行时重新加载自定义 UITableViewCell 的 Nib

Posted

技术标签:

【中文标题】在运行时重新加载自定义 UITableViewCell 的 Nib【英文标题】:Reload Nib of custom UITableViewCell at runtime 【发布时间】:2012-04-21 23:01:08 【问题描述】:

您好,我有两个自定义 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 中,但是当我返回视图时,单元格视图没有更改,我必须退出应用程序,关闭从后台打开应用程序,然后重新打开它,并加载它的新视图,所以有一种方法可以在不退出应用程序的情况下重新加载我的视图?

【问题讨论】:

选择后是否重新加载tableView的数据? 是的,我愿意 [self.tableview reloadData];在视图中会出现,但不起作用... 【参考方案1】:

因此,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;
            
        
    

【讨论】:

谢谢你的回答,我试过这个:[[NSUserDefaults standardUserDefaults] synchronize];当用户做出选择时,但是当我返回 tableview 时,什么都没有改变...... 我认为问题在于如果(cell == nil)不要在此语句中输入,因此不要重新加载单元格... 我只会这样做: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[[NSUserDefaults standardUserDefaults] valueForKey:@"iEpisodeSettingViewCell"]];和 viewwillappear 方法中的重新加载数据,现在可以工作了,通过这种方式识别新的单元格标识符,谢谢!

以上是关于在运行时重新加载自定义 UITableViewCell 的 Nib的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义数组保存/重新加载到 plist

自定义 TableViewCells 在重新加载 tableview 时闪烁

Colorbox - 在颜色框内容中删除自定义 iframe 时防止父页面重新加载?

在 playframework 中重新加载自定义文件更改的应用程序

自定义 CollectionView 布局重新加载数据不起作用

从 svg 标记字符串重新加载自定义工具