我有一個UITableView有2個部分。部分0包含文件名列表,用戶可以點擊它們來切換選中的附件。此部分也是可編輯的,因此用戶可以輕掃以刪除文件/行。第1部分不可編輯,並且包含1行,並用作啓動文件傳輸的按鈕。一次編輯UITableView的多個部分會導致崩潰
因此,該表的數據源看起來像這樣:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case SECTION_FILES:
return [files count];
break;
case SECTION_ACTIONS:
if ([files count]) {
return 1; // ROW_ACTIONS_TRANSFER
return 0;
break;
}
return 0;
}
,我想是爲第1只顯示當部分0具有行中的行爲。我發現的問題是,當部分0中的最後一行被刪除時,部分1仍然包含1行。要從第一部分刪除行,我想我應該調用deleteRowsAtIndexPath或reloadSections,同時提交第0部分最後一行的編輯,然後單元格將被動畫化。但是,這樣做會導致我的應用程序崩潰說:
終止應用程序由於未捕獲的異常「NSInternalInconsistencyException」,理由是:「無效的更新:第1節包含在現有的部分中的行數行數無效在更新(1)之後,必須等於在更新(1)之前包含在該部分中的行數,加上或減去從該部分插入或刪除的行數(0插入,1刪除)。
我可以在tableview上調用reloadData,但更新是一個劇烈的重繪,我更願意爲單元格設置動畫。有沒有辦法實現我想要的?我覺得這應該很容易,我錯過了一些明顯的東西。
我的commitEditingStyle代碼如下。我首先從我的數據源(文件)中刪除,這是推薦的方式,對嗎?
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
switch ([indexPath section]) {
case SECTION_FILES:
[files removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
// Here is where I would call [tableView reloadData] or [tableView reloadSection...
break;
}
}}
在提交表視圖動畫之前或之後,您是否從「文件」NSArray中刪除? (如果您提供了tableView:commitEditingStyle:forRowAtIndexPath:內容以便我們可以看到您是否有動畫塊以及您在做什麼的順序會很有幫助) – 2010-08-16 22:30:13
更新後回答布倫特。 – brianpartridge 2010-08-18 16:44:04