我在同一个UITableView中插入和删除UITableViewCells时遇到了很多麻烦!
我通常不会发布代码,但我认为这是显示我遇到问题的最佳方式:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 5;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (iSelectedSection == section) return 5;
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//NSLog(@"drawing row:%d section:%d", [indexPath row], [indexPath section]);
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
if (iSelectedSection == [indexPath section]) {
cell.textColor = [UIColor redColor];
} else {
cell.textColor = [UIColor blackColor];
}
cell.text = [NSString stringWithFormat:@"Section: %d Row: %d", [indexPath section], [indexPath row]];
// Set up the cell
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic -- create and push a new view controller
if ([indexPath row] == 0) {
NSMutableArray *rowsToRemove = [NSMutableArray array];
NSMutableArray *rowsToAdd = [NSMutableArray array];
for(int i=0; i<5; i++) {
//NSLog(@"Adding row:%d section:%d ", i, [indexPath section]);
//NSLog(@"Removing row:%d section:%d ", i, iSelectedSection);
[rowsToAdd addObject:[NSIndexPath indexPathForRow:i inSection:[indexPath section]]];
[rowsToRemove addObject:[NSIndexPath indexPathForRow:i inSection:iSelectedSection]];
}
iSelectedSection = [indexPath section];
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:rowsToRemove withRowAnimation:YES];
[tableView insertRowsAtIndexPaths:rowsToAdd withRowAnimation:YES];
[tableView endUpdates];
}
}
此代码创建5个部分,第1个(从0开始索引),包含5行。当您选择一个部分时 - 它会删除您之前选择的部分中的行,并将行添加到您刚刚选择的部分。
Pictorally,当我加载应用程序时,我有类似的东西:
图片在这里:http://www.freeimagehosting.net/uploads/1b9f2d57e7.png
在选择第2部分的表格行0后,然后删除第1部分的行(默认选中)并添加第2部分的行。但是我明白了:
图片在这里:http://www.freeimagehosting.net/uploads/6d5d904e84.png
......这不是我期望发生的事情!似乎第2部分的第一行仍以某种方式保留 - 即使它肯定会被删除。
如果我只是做一个[tableView reloadData],一切看起来都很正常......但我显然已经准备好了很好的动画。
如果有人能在这里发光,我真的很感激!这让我有点疯狂!
再次感谢, 尼克。
答案 0 :(得分:6)
挣扎着让这个发挥作用。这是我向tableView添加一行的代码:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[tableView beginUpdates];
[dataSource insertObject:[artistField text] atIndex:0];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
[tableView endUpdates];
答案 1 :(得分:1)
我似乎记得numberOfRowsInSection:当你调用deleteRows或insertRow时会被调用,你需要非常小心现实numberOfRowsInSection cliams匹配你的更改。在这种情况下,您可能想尝试移动iSelectedSection = [indexPath section];在endUpdates之后行到。
答案 2 :(得分:1)
我不记得我在哪里读过这篇文章,但我相信你不应该从其中一个表视图委托函数中执行表行更新(插入和删除)。我认为更好的选择是将performSelectorOnMainThread传递给作为对象执行更新所需的必要信息。类似的东西:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// ....
[self performSelectorOnMainThread: @selector(insertRows:)
withObject: someObjectOrNil]; // double check args
}
- (void) insertRows: (NSObject*)someObjectOrNil {
[tableView beginUpdates];
// update logic
[tableView endUpdates];
// don't call reloadData here, but ensure that data returned from the
// table view delegate functions are in sync
}
答案 3 :(得分:0)
在您发布的代码中,您的循环索引从0到4运行,这表示它将删除第1部分中的所有行,然后向第2部分添加5个新行。每个部分已经有一个0行,这将在表2中添加第2部分第0行的第二个实例。
我建议你的循环从1到4运行:
for (int i=1; i<5; i++)
{
// ...
}
答案 4 :(得分:0)
仅供参考:这个错误似乎已经完全通过2.2 iPhone更新修复了。 谢谢Apple! 缺口。