2011-06-15 93 views
6

我有正被重新裝入新的內容被添加的tableview,使用[tableview reloadData];重裝的tableview和觸摸手勢

麻煩是我有一個UILongPressGestureRecognizer上在表TableCells並且由於細胞/表正在相當重新加載經常LongPress並不總是有時間工作,我猜測它的內部定時器在重新加載單元格/表格時正在重置。

+0

更新的頻率是多少? – 2011-06-15 07:19:10

+0

細胞正在發生什麼樣的變化?整個表格是否改變,或者當時只有一個單元格? – EmilioPelaez 2011-06-15 07:27:40

+0

更新經常發生。 – daidai 2011-06-15 07:31:51

回答

4

您是否在[tableView reloadData]被調用之前試過看過您的UILongPressGestureRecognizer s的狀態?例如:

// Returns |YES| if a gesture recognizer began detecting a long tap gesture 
- (BOOL)longTapPossible { 
    BOOL possible = NO; 

    UIGestureRecognizer *gestureRecognizer = nil; 
    NSArray *visibleIndexPaths = [tableView indexPathsForVisibleRows]; 

    for (NSIndexPath *indexPath in visibleIndexPaths) { 
     // I suppose you have only one UILongPressGestureRecognizer per cell 
     gestureRecognizer = [[tableView cellForRowAtIndexPath:indexPath] gestureRecognizers] 
           lastObject]; 
     possible = (gestureRecognizer.state == UIGestureRecognizerStateBegan || 
        gestureRecognizer.state == UIGestureRecognizerStateChanged); 
     if (possible) { 
      break; 
     } 
    } 
    return possible; 
} 

// ... later, where you reload the tableView: 

if ([self longTapPossible] == NO) { 
    [tableView reloadData]; 
} 

讓我知道它是否有效!

+0

+1用於暗示檢查'UIGestureRecognizer.state' – Till 2011-07-02 01:15:03

0

設置像一個aCellIsSelected BOOL爲是當你觸摸細胞

,只是重裝的tableview如果aCellIsSelected是NO

+0

這樣做的麻煩是UILongPressGestureRecognizer直到一段很長的時間才結束。我不能聽didSelectRowAtIndexPath,因爲這是一個水龍頭,並不是一個新聞,所以它也不會被調用。 – daidai 2011-06-16 02:16:30

+0

你可以繼承UITableViewCell並設置setHighlighted中的值 – FoJjen 2011-06-16 06:46:44

3

,如果你想現有的細胞仍然不要使用reloadData。相反,當您獲取新數據時,請使用Inserting and Deleting Cells的方法通知表格視圖確切地指出哪些單元格已更改。一般程序是:

  1. 您將獲得新數據。
  2. 致電beginUpdates
  3. 致電deleteRowsAtIndexPaths:withRowAnimation:刪除在新數據中已刪除的舊項目的單元格。
  4. 致電insertRowsAtIndexPaths:withRowAnimation:爲已添加到新數據中的任何項目添加新單元格。
  5. 如果您由於某種原因需要選擇性地替換特定單元(並且不能僅使用新數據更新現有單元的子視圖),請使用reloadRowsAtIndexPaths:withRowAnimation:
  6. 致電commitUpdates。此時,您的方法必須反映新數據(例如,tableView:numberOfRowsInSection:應反映更改的計數,而tableView:cellForRowAtIndexPath:應使用新項目)。
  7. 表視圖現在將根據需要調用您的數據源方法來更新顯示。現有的行不會被改變。
+0

我曾嘗試過這種技術,並發現reloadData方法對我的系統來說要好得多。有沒有辦法檢測用戶是否將手指放在設備上? – daidai 2011-06-28 00:54:28