我最近一直在使用UITableView。它会动态填充一次,然后当用户选择一个选项时,我希望列表更改为新列表。我正在使用包含3个部分的分组表,当您单击行时,需要使用不同数量的新行重新填充这三个组。 当新代码中的行数与旧代码相同时,我的代码工作正常,但当代码更改时会崩溃。有趣的是,它会等到崩溃,直到它尝试绘制其中一个之前存在的单元格(tableView仍然认为该部分具有旧的行数,尝试绘制不再在我的模型对象中的单元格,因此我认为它崩溃了,因为它引用了新数组中的值不存在。
它在这里崩溃了:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = nil;
cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"MyCell"];
}
if (indexPath.section==2){
//CRASH BELOW
cell.textLabel.text = [NSString stringWithFormat:@"%@", (NSString *)[[[[storyArray objectAtIndex:pageNumber]getChoices] objectAtIndex:(unsigned long)indexPath.row]objectAtIndex:0]] ;
}
return cell;
}
我用来重新加载表的函数在这里:
-(void)changePage:(int)pageChangeNumber{
NSLog(@"The page change! Changing to: %@",[[storyArray objectAtIndex:pageChangeNumber]getTitle]);
pageHeader.text=[[storyArray objectAtIndex:pageChangeNumber] getTitle];
pageBody.text=[[storyArray objectAtIndex:pageChangeNumber] getBody];
[myTableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
[myTableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade];
[myTableView reloadSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade];
[myTableView reloadData];
pageNumber=pageChangeNumber;
NSLog(@"Page Change Done");
}
我还将numberofRowsInSection更改为动态...
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSLog(@"Recounting Rows");
if (section==2){
return [[[storyArray objectAtIndex:pageNumber]getChoices] count];
} else {
return 0;
}
}
当每个部分的行数发生变化时,有关如何使其工作的任何想法? 谢谢!
答案 0 :(得分:1)
我不知道你得到了什么样的崩溃,但如果numberOfSectionsInTableView:
或tableView:numberOfRowsInSection:
方法在表重组时返回了不同的行数,我就会遇到崩溃。
例如,UITableView在重绘时(包括动画期间)多次调用这些方法。在我的后端,一些值在动画期间发生了变化。
在更改UITableView
之前,我必须特别注意同步这些值答案 1 :(得分:1)
在更新表格视图的数据并调用reloadSections之前,您需要先致电[myTableView beginUpdates]
并在完成后[myTableView endUpdates]