2011-10-22 68 views
8

iOS 5最後添加了一個moveRowAtIndexPath:toIndexPath:方法到UITableView。問題是,調用它只會移動行,它不會更新/重繪它。唯一的方法似乎是直接找到單元並調用setNeedsDisplay。但是這很棘手,因爲你永遠不知道單元格是否已經移動。moveRowAtIndexPath不刷新單元格的內容

我也不能撥打reloadRowsAtIndexPaths:,因爲我不允許在同一個beginUpdates-endUpdates區塊內的單個行上應用2個動畫。

我可以想到的解決方法有很多,例如將整個事件分成2個動畫塊。但我想知道我是否錯過了一些東西,因爲整個行爲對我來說似乎很古怪。

+0

不確定,但請嘗試查看'beginUpdates'和'endUpdates'。您可能能夠跟蹤正在移動的indexPath,並在「endUpdates」中將其更改爲適當的單元格(如果已移動)。 – runmad

+0

在endUpdates取消該單元格的待定動畫之後調用任何新行動畫函數。換句話說,單元格會重繪,但移動動畫不會再發生。調用'setNeedsDisplay'也有類似的效果。 – samvermette

+0

提交錯誤報告:http://openradar.appspot.com/10457435 – samvermette

回答

14

最後收到正式答覆蘋果就這個問題:

工程已確定以下信息基於 按預期這個問題表現:

只有插入和更新導致細胞是請求從數據 源(第一個,因爲它是新的,第二個,因爲你已經明確告訴表視圖更新單元格 )。刪除並移動 不會更新內容,因爲在執行的動作 中並不隱含。如果您需要在更新過程中更改單元格 的內容,只需進入單元格並更改內容即可。

2

他們喜歡難以讓我們不要他們;-)

case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
     break; 

    case NSFetchedResultsChangeMove: 
     // old API 
     //[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     //[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

     // new API 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath 
     [tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0); 
     break; 

注意在ChangeMove,configureCell具有相比,其在ChangeUpdate使用所以,如果複製粘貼仔細不同PARAMS。相當棘手的做對了。