Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在运行时重新加载自定义UITableViewCell的Nib_Iphone_Ios_Uitableview_Xib_Nib - Fatal编程技术网

Iphone 在运行时重新加载自定义UITableViewCell的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 nib,我给用户选择nib类型的选项,在设置中,我用以下方式初始化自定义视图单元格:

- (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方法中的重新加载数据,现在可以工作了,通过这种方式识别新的单元格标识符谢谢!