2010-04-27 91 views
3

我有一個NSFetchedResultsController支持的UITableView,它可以在任何時候觸發更新。如果用戶正在重新排序行,將這些更新將導致異常,因爲表視圖暫時接管,你會得到像當UITableView被重新排序時檢測

Invalid update: invalid number of rows in section [...] 

錯誤我如何檢測,當用戶已經開始移動的小區,所以我可以延遲更新結果控制器造成的更新嗎?似乎沒有任何表視圖委託方法來檢測這一點。該委託方法:

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { 

在用戶首次分離的第一個單元格不會被調用,只有當他們實際移動到其他地方。

一種解決辦法是檢查所取得的成果回調isEditing,只是做了散裝reloadData,而不是動態插入/刪除行,但我不知道是否有一種方法專門爲「重排」模式檢查。

回答

0

前表移動的排它發送...

– tableView:canMoveRowAtIndexPath: 

...它的數據源。您可以在該單元格實際移動之前放置一個編輯鎖定,該鎖定將生效。

你可能想重新考慮一下你的設計。這聽起來像你有一個數據模型,可以同時修改兩個不同的來源。如果是這樣,那麼您需要在數據模型本身內設置某種併發鎖定,因此這兩個修改實際上不能同時發生。同時修改不僅會導致用戶界面出現問題,而且會導致使用數據模型的任何問題。

+0

但可能tableview可能會調用,而不是在移動單元格之前。沒有文件記錄,在移動單元之前總是調用它,所以依靠這種行爲不太可能是未來的證明。我的數據模型沒問題,我正在以標準方式將更改合併到核心數據模型中,以便在主線程上正確發送更改請求。 – 2010-05-07 10:15:55

+0

在UI移動單元格之前,每次調用此方法。數據模型驅動更改時不會調用它。唯一的目的是檢查UI事件是否可以移動單元格。你將不得不設置標誌來防止數據或用戶改變表格,而另一個用戶正在做它。你有一個競爭條件。 – TechZen 2010-05-07 16:17:19

1

你錯了,tableView:canMoveRowAtIndexPath不能解決問題。

在要更新或刪除的所有單元格上使用[cell setEditing:NO]。

如果用戶正在拖動單元格,則拖動模式將被取消。

如果你需要[cell setEditing:YES],你可以在完成你正在更新的任何東西后立即恢復它。

相關問題