【发布时间】:2016-03-21 18:50:27
【问题描述】:
我在父 UIView 中嵌入了一个 UITableView。我有一个 CustomUITableViewController 类设置为 tableview 的委托和数据源。 在某个后台操作之后,我得到了一个更新的对象数组,这些对象将显示在 tableview 中。
当我更新数据源数组并调用 tableview.reloadData 方法时,tableview 不会刷新。如果我滚动表格视图,它只会刷新。
但是,如果我按如下方式调用 API:
tableview.beginUpdates -> tableview.reloadSections -> tableview.endUpdates,
它完美运行并立即重新加载表格。 问题是,根据新数据,我必须添加一个新部分,或者从 tableview 中删除一个旧部分。
因此我无法使用 reloadSections API。
关于如何解决这个问题的任何想法?
代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellID = @"tempCell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
[cell initializeWithModel:modelsToShow[indexPath.row]];
return cell;
}
-(void) showModelsInList:(NSMutableArray*) models {
[modelsToShow removeAllObjects];
[modelsToShow addObjectsFromArray:models];
[self setupDataForList];
[self reloadTable];
}
-(void) reloadTable {
[self.tableView beginUpdates];
NSMutableIndexSet* index = [[NSMutableIndexSet alloc]init];
[index addIndex:0];
[self.tableView reloadSections:index withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
//[self.tableView reloadData]
}
showModelsInList 方法是从主线程本身中的另一个类调用的。
【问题讨论】:
-
你是从主线程(队列)调用
reloadData吗? -
是的,我是。我直接尝试了 reloadData 以及 performSelectorOnMainThread API。他们两个都没有工作。
-
请发布您的
cellForRowAtIndex实现以及您致电reloadData的位置。 -
我已更新问题以包含代码 sn-p。
-
到目前为止您发布的内容看起来不错。请显示
initializeWithModel。我正在寻找您对cellForRowAtIndexPath中的单元格所做的更改。从排队的单元格添加/删除/重新排列视图并不总是立即更新,并且可能导致您描述的问题。相反,为每个布局使用不同的单元原型,并在cellForRowAtIndexPath中相应地设置标识符。或者为了测试理论,只是为了测试,不要重复使用单元格(不要打电话dequeueReusableCellWithIdentifier),看看问题是否消失。
标签: ios objective-c uitableview