2012-08-22 74 views
0

我在UITableView上使用滑動手勢。我試圖在向左滑動時在TableViewCell上執行操作。我注意到正確的細胞被刷過,但由於某種原因,它似乎激活了一個隨機的其他細胞。左手滑動手勢無法正常工作。 UITableView

我懷疑它與指針有什麼關係?內存指針我不太好,所以任何幫助都會很棒。處理該輕掃的代碼是:

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)gestureRecognizer 
{ 
    // Get location of the swipe 
    CGPoint location = [gestureRecognizer locationInView:self.requestTableView]; 

    // Get the corresponding index path within the table view 
    NSIndexPath *indexPath = [self.requestTableView indexPathForRowAtPoint:location]; 

    // Check if index path is valid 
    if(indexPath) 
    { 
     //Get the cell out of the table view 
     requestCell *cell = (requestCell *)[self.requestTableView cellForRowAtIndexPath:indexPath]; 

     NSLog(@"%@", [cell.IDLabel text]); 


     cell.sendingImage.hidden = false; 
     cell.activityIndicator.hidden = false; 
     cell.requestorLabel.hidden = true; 
     cell.dueDateLabel.hidden = true; 
     cell.IDLabel.hidden = true; 
     cell.priorityImage.hidden = true;  
    } 
} 

回答

0

呼喚「的cellForRowAtIndexPath」將很可能不會給你在屏幕上當前可見的小單元的實例。 UITableView是基於單元重用的(如果正確使用) - 這意味着,每次調用「cellForRowAtIndexPath」時,表視圖都會嘗試查找未使用的單元格,如果沒有,則創建一個新單元格。 就你的情況而言,這意味着你執行滑動手勢的單元格與處理滑動時調用cellForRowAtIndexPath方法時獲得的單元格不同。而是返回一個當前未使用的單元類型實例,並在該實例上執行更改。 解決此問題的一種方法是,不要直接在手勢處理程序中更改單元格屬性,而是更改用於填充單元格的數據模型,然後調用​​來刷新單元格。

+0

應該是一個相當簡單的測試假設:添加一些代碼來記錄位置,並在幾個不同的滾動位置上滑動同一個單元格。同時滑動幾個不同的單元格滾動到相同的屏幕位置。 –

+0

感謝您的意見。我會考慮直接操縱數據模型。然而,我做了一個記錄什麼單元格被刷過。它確實返回我滑過的右側細胞。該操作在滑動的單元格上表現良好,但由於某些原因,它還會導致另一個不在屏幕上的單元格將狀態更改爲正在滑動。感謝您的意見! – Alan

+0

也許那麼問題在於,當它被重用時,你沒有完全重置單元格的內容? @Steffan Blass是正確的,發生了這種情況。如果你的代碼(如圖所示)只在滑動時操縱單元格的狀態,當你滾動表格時會發生什麼? (該單元格將不在視圖中,然後被重新用於不同的索引路徑....) –

0

也許你應該繼承UITableViewCell並將swipeGesture直接添加到單元格中。 只是一個想法。雖然沒有想過。