Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.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
Ios 强制UITableView为所有单元格调用cellForRowAtIndexPath:_Ios_Reloaddata_Uitableview - Fatal编程技术网

Ios 强制UITableView为所有单元格调用cellForRowAtIndexPath:

Ios 强制UITableView为所有单元格调用cellForRowAtIndexPath:,ios,reloaddata,uitableview,Ios,Reloaddata,Uitableview,UITableView的重新加载数据方法遇到了一些问题。我发现,只有在添加或删除新的单元格时,它才会调用cellForRowAtIndexPath 示例:我有五个单元格,每个单元格包含五个字符串。如果我添加一个新单元格并调用reloadData,表就会更新,我会看到它。但是,如果我进入五个单元格中的一个,添加一个新字符串,然后返回并调用reloadData,则不会调用表视图的委托方法 我的问题:是否可以强制表视图在其所有可见单元格中完全重新加载数据?嗯,表视图只会在可见单元格上调用cellfor

UITableView的
重新加载数据
方法遇到了一些问题。我发现,只有在添加或删除新的单元格时,它才会调用cellForRowAtIndexPath

示例:我有五个单元格,每个单元格包含五个字符串。如果我添加一个新单元格并调用
reloadData
,表就会更新,我会看到它。但是,如果我进入五个单元格中的一个,添加一个新字符串,然后返回并调用
reloadData
,则不会调用表视图的委托方法


我的问题:是否可以强制表视图在其所有可见单元格中完全重新加载数据?

嗯,表视图只会在可见单元格上调用
cellforrowatinexpath
,但如果调用
reloadData
,它会这样做,因此这里还有其他事情,我不确定它是什么。

即使表视图有50行,一次也只能存在尽可能多的可见单元格。这就是重用标识符背后的全部故事。所以强制“所有细胞”并不存在。如果出现新单元格,则动态加载数据


更改单元格的唯一方法是更改数据源方法CellForRowatineXpath传递的数据。

我发现了问题-我的单元格自定义代码位于
if(cell==nil)
块中,因此由于单元格正在被回收,因此没有被更改。将我的自定义代码从该块中取出修复了问题。

如果(cell==nil)块中,请不要将代码从
块中取出。相反,为正在创建的单元格创建一个具有代表性的标识符;尝试并确保标识符中引用了单元格的所有内容。例如,如果有3个数字显示,请确保标识符中的这三个数字以唯一的方式显示,该方式只能引用包含此类内容的单元格

假设类中有三个NSArray属性,即array1、array2和array3,它们的int值包装在NSNumber对象中。如果要使用这些NSArray填充UITableView,我会这样做:

- (UITableViewCell *)tableView:(UITableView *)tableView 
                     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@",
                            [[array1 objectAtIndex:indexPath.row] intValue],
                            [[array2 objectAtIndex:indexPath.row] intValue],
                            [[array3 objectAtIndex:indexPath.row] intValue]];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
                                  initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:identifier] autorelease];

        //Build your cell here.
    }

    return cell;
}

我发现重新加载节更容易重新加载数据。如果您只有一个部分,您可以尝试:

[self.tableView重新加载节:[NSIndexSet indexetwithindex:0]带RowAnimation:UITableViewRowAnimationNone];

你可以试试这个

[tableView reloadData];


将其放入
committeeditingstyle
方法中。

在这种情况下,所有单元格都可见。我知道数据源(在本例中为NSUserDefaults)正在更新,因此我不确定为什么只更新新的单元格。您是否跟踪了对
CellForRowatineXpath
的调用以证明它没有被调用,或者您只是没有看到视觉变化?如果未调用
cellforrowatinexpath
。。。我不知道发生了什么事。在这一点上,我会后退一步,跟踪对
numberofrowsinssection
的调用。在任何情况下,我都可以说,当您重新加载数据时,应该为每个可见的单元格调用
cellforrowatinexpath
;我最初的假设是错误的。从另一个视图控制器返回到表视图时调用reloadData时,不调用任何内容。是否显式调用
reloadData
?它不会因为表视图再次可见而自动调用。是的,我现在还不知道。我怀疑你的程序中有什么东西,因为这种行为听起来不正确,但在你发现问题的原因之前,谁知道,可能是苹果的bug。不太可能,但并非不可能。如果您尝试
重新加载rowsatindexpaths:withRowAnimation:
只是为了检查。。。不要让这成为解决方案。你确定你传递给
reloadData
的变量当时不是零吗?你节省了我的时间。非常感谢。我不会猜到这个愚蠢的错误:)很高兴我的解决方案能帮助别人!
[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];