2009-06-15 9 views
16

私はpagingEnabledを持つUITableViewを持っています。各セルは、表の表示領域を占有します。意味は、各セルは表と同じ高さと幅です。私はnameプロパティを持つカスタムセルを使用しています。現在の(表示可能な)セルの名前をラベルに表示したいと思います。これは最初と最後のセルでうまく動作しますが、中にあるものはそれほど簡単ではありません。問題は、cellForRowAtIndexPathがこれらの中間セルに対して2回呼び出されることです。ここからは、最初のセルから最後のセルまでスクロールした後に戻るように見えます。私は真ん中の列にいるかどうかを検出するためにNSDateオブジェクトを使用して設定することができ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 

:私は、その行のcellForRowAtIndexPath火災として順にインデックスをリストアップしました。以前の時間と現在の時間を分けることで、わかります。しかし、ユーザーがセルをすばやくスクロールすると、おそらく動作しません。それを行う別の方法がありますか?

私は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

これは唯一の問題は、ソートされていないということです。それらを並べ替えたり、配列に正しい順序で追加したりする簡単な方法はありますか? –

+0

+1これも私の質問に答えます。 –

+21

[tableView visibleCells]で可視のセルを取得することもできます。 – George

2

UITableViewがセルを要求するときに焦点を当てるのではなく、デリゲートメソッドtableView:willDisplayCell:forRowAtIndexPathによって示されるセルを表示するときに焦点を合わせる必要があります。

+0

willDisplayCell yeilds私が掲載したのと同じ結果です。 – 4thSpace

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

シンプルに、場合indexpath

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

を使用して可視セルを取得する必要がUITableViewの可視セルを取得しないためのエレガントな方法の可視細胞が必要です。

NSArray * paths = [tableView indexPathsForVisibleRows]; 
関連する問題