2009-06-15 80 views
16

我有一個帶有pagingEnabled的UITableView。每個單元格佔用了表格的查看區域。意思是,每個單元格與桌子的高度和寬度相同。我正在使用具有name屬性的自定義單元格。我想在標籤中顯示當前(可查看)單元格的名稱。這對於第一個和最後一個單元格都可以正常工作,但是任何內容都不是那麼容易。問題是這些中間單元格調用了兩次cellForRowAtIndexPath。以下是從第一個單元格到最後一個單元格然後回滾的樣子。我列出的指標,以便爲的cellForRowAtIndexPath火災該行:從UITableView中獲取可見單元pagingEnabled

Row    indexPath.row 
0     0   //view loads and table appears 
1     1,2  //user scrolls to second cell. cellForRowAtIndexPath fires twice. First time indexPath.row is one and second time it is two. This causes cell two's name to display in the label, rather than cell one. 
2     2,3 
3     3 
//user starts scrolling back to first cell 
2     1,2 
1     1,0 
0     0 

我可以設置使用一個NSDate對象來檢測,如果我在一箇中間行來的。通過以前的時間與現在的區別,我會知道的。但是,如果用戶在單元格中快速滾動,則可能不起作用。還有另一種方法可以做到嗎?

我試過使用變量的visiblecells屬性,但沒有奏效。 UITableView將加載下一個單元,即使它不可見,導致它成爲可見單元的一部分。

回答

44

那麼,如果你從未想出解決方案,或者接下來談到這個問題的人,我會向你提供你正在尋找的答案。 UITableView中將爲您提供您正在尋找的indexPaths,然後UITableView中會很樂意爲您提供符合這些指標的路徑,該細胞:

UITableView *tableView = self.tableView; // Or however you get your table view 
NSArray *paths = [tableView indexPathsForVisibleRows]; 

// For getting the cells themselves 
NSMutableSet *visibleCells = [[NSMutableSet alloc] init]; 

for (NSIndexPath *path in paths) { 
    [visibleCells addObject:[tableView cellForRowAtIndexPath:path]]; 
} 

// Now visibleCells contains all of the cells you care about. 
+1

唯一的問題是它們沒有排序...有沒有簡單的方法來排序它們,或者按照正確的順序將它們添加到數組中? – 2011-09-09 04:45:05

2

與其專注於UITableView何時請求單元,您應該關注何時顯示單元,該單元由代理方法tableView:willDisplayCell:forRowAtIndexPath指示。

+0

willDisplayCell yeilds我發佈了同樣的結果。 – 4thSpace 2009-06-15 21:27:57

2

轉換道格拉斯例如斯威夫特:

let tableView = self.tableView // Or however you get your table view 
let paths = tableView.indexPathsForVisibleRows 

// For getting the cells themselves 
let visibleCells : NSMutableSet = [] 

for path in paths! { 
    visibleCells.addObject(tableView.cellForRowAtIndexPath(path)!) 
} 
0

簡單要檢索的UITableView可見細胞優雅的方式,無需使用indexpath

NSArray * visibleCells = tableView.visibleCells; 
NSLog(@"Total visible Cells: %i", [visibleCells count]); 

如果獲得可見的單元格需要的可見細胞

NSArray * paths = [tableView indexPathsForVisibleRows]; 
相關問題