Iphone 在运行时重新加载自定义UITableViewCell的Nib
您好,我有两个自定义UITableViewCell nib,我给用户选择nib类型的选项,在设置中,我用以下方式初始化自定义视图单元格:Iphone 在运行时重新加载自定义UITableViewCell的Nib,iphone,ios,uitableview,xib,nib,Iphone,Ios,Uitableview,Xib,Nib,您好,我有两个自定义UITableViewCell nib,我给用户选择nib类型的选项,在设置中,我用以下方式初始化自定义视图单元格: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"MasterViewCell"; UITableViewCell *cell
- (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的名称)中,但当我返回视图时,单元格视图没有更改,我必须退出应用程序,从后台关闭应用程序,然后重新打开它,并加载新视图,因此,有一种方法可以在不退出应用程序的情况下重新加载我的视图?因此,NSUserDefaults的工作方式是,即使使用setValue:forKey:(或其他setter便利方法之一),它实际上也不会立即被写出。操作系统试图通过在一段时间后、应用程序退出时等来优化该plist的保存。在此之前,您设置的值只是缓存,以避免操作系统多次打开和关闭数据库。因此,当您尝试获取单元格的值时,它将进入数据库并检索可能是旧值的内容。当您退出应用程序时,NSUserDefaults会写出您设置的新值,当您返回时,您会得到正确的值 要“强制”NSUserDefault立即写入数据库,请在根据用户输入设置值后立即尝试调用
synchronize
。这将写入数据库,因此当您调用valueForKey:method时,应该返回正确的内容
更新:我还将重新构造此方法的逻辑流。首先,如果要从两个不同的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;
}
}
}
}
选择后是否重新加载tableView的数据?是的,我会[self.tableView reloadData];在视图中将出现,但不起作用…感谢您的回答,我尝试了以下方法:[[NSUserDefaults standardUserDefaults]synchronize];当用户做出选择时,但当我返回tableview时,没有任何变化……我认为问题是因为如果(cell==nil)不输入此语句,因此不重新加载单元格……我将只执行以下操作:UITableViewCell*cell=[tableview dequeueReusableCellWithIdentifier:[[NSUserDefaults standardUserDefaults]valueForKey:@“iEpisodeSettingViewCell”]];和ViewWillExample方法中的重新加载数据,现在可以工作了,通过这种方式识别新的单元格标识符谢谢!