我有一個多節的tableview。在編輯模式中,我允許將行從一個部分移動到另一個部分。一旦最後一行從一個部分刪除,我刪除該部分。所以我使用moveRowAtIndexPath中的deleteSection。將最後一行移出部分和刪除部分時的奇怪動畫
當最終項目從該部分移開時,部分標題按計劃消失。但是有一個非常奇怪的動畫錯誤,其中被移動的行似乎與其上面放置的行「合併」,並且在「to」部分的底部顯示了空行(可能是因爲該部分的numberOfRows是正確,但2行在同一位置)。更奇怪的是,當我點擊該行的重新排序控件(不移動項目,只是觸摸並釋放)時,兩個項目「unmerge」。
我發佈了一個video演示這個。
我試過包裝我的數據更改並查看開始/結束更新中的更改,但無濟於事。
我上傳了一個測試項目here,我也會發佈下面的代碼。幾點:
- 我試圖在演示項目中複製我的數據源的格式,以防發生問題。關鍵是我的源碼是兩個其他數組的複合數組(儘管我不明白爲什麼這會是一個問題)。
- 要查看有問題的行爲,請將底部的兩行移動到頂部。不要將它們放在頂部的最後一行,因爲這似乎工作正常。
- 從上面的部分到下面的部分以另一種方式移動行,在這個演示項目中是錯誤的。
代碼(這一切都是在演示項目):
我的loadView設置我的數組:
- (void)loadView{
array1 = [NSMutableArray array];
[array1 addObject:@"test 0"];
[array1 addObject:@"test 1"];
[array1 addObject:@"test 2"];
array2 = [NSMutableArray array];
[array2 addObject:@"test a"];
[array2 addObject:@"test b"];
[super loadView];
}
我也有一個返回的這些組合的方法陣列 - 這是用作數據源:
- (NSMutableArray *)sourceArray{
NSMutableArray *result = [NSMutableArray array];
if (array1.count > 0) {
[result addObject:array1];
}
if (array2.count >0) {
[result addObject:array2];
}
return result;
}
它允許非常簡單的ro WS /部分:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return self.sourceArray.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [[self.sourceArray objectAtIndex:section] count];
}
標準單元/頭文件格式:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text = [[self.sourceArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [NSString stringWithFormat:@"Section %i", section];
}
這是你的行或裏面有什麼,我做魔術
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
NSMutableArray *fromArray = [self.sourceArray objectAtIndex:fromIndexPath.section];
NSMutableArray *toArray = [self.sourceArray objectAtIndex:toIndexPath.section];
NSString *movedObject = [[self.sourceArray objectAtIndex:fromIndexPath.section] objectAtIndex:fromIndexPath.row];
[fromArray removeObject:movedObject];
[toArray insertObject:movedObject atIndex:toIndexPath.row];
if ([self.tableView numberOfRowsInSection: fromIndexPath.section] == 0) {
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:fromIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
}
}
你爲什麼要-loadView設置您的陣列?如果以編程方式創建視圖,則應該只覆蓋-loadView。沒有?並且調用[super loadView]嘗試加載與所討論的視圖控制器相同名稱的筆尖。爲什麼不把你的數組設置移動到-viewDidLoad? – 2012-04-03 01:58:43
感謝 - 任何鏈接/更多信息爲什麼這是/這個規則來自哪裏?當然沒有幫助我的問題,但謝謝你的提示。 – 2012-04-03 02:18:35
,因爲如果您在nib中設置視圖,loadView會被操作系統調用。該方法的文檔明確指出不直接調用此方法,並且不要覆蓋如果從nib加載視圖。 – jmstone617 2012-04-04 16:06:06