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