将UITableview部分刷新为具有不同行数的部分

时间:2012-05-01 17:26:04

标签: iphone objective-c xcode uitableview

我最近一直在使用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;
}

}

当每个部分的行数发生变化时,有关如何使其工作的任何想法? 谢谢!

2 个答案:

答案 0 :(得分:1)

我不知道你得到了什么样的崩溃,但如果numberOfSectionsInTableView:tableView:numberOfRowsInSection:方法在表重组时返回了不同的行数,我就会遇到崩溃。

例如,UITableView在重绘时(包括动画期间)多次调用这些方法。在我的后端,一些值在动画期间发生了变化。

在更改UITableView

之前,我必须特别注意同步这些值

答案 1 :(得分:1)

在更新表格视图的数据并调用reloadSections之前,您需要先致电[myTableView beginUpdates]并在完成后[myTableView endUpdates]