web-dev-qa-db-ja.com

UITableViewから可視セルを取得するpagingEnabled

PagingEnabledを備えたUITableViewがあります。各セルは、テーブルの表示領域を占めます。つまり、各セルはテーブルと同じ高さと幅です。 nameプロパティを持つカスタムセルを使用しています。現在の(表示可能な)セルの名前をラベルに表示したいのですが。これは最初と最後のセルで問題なく機能しますが、その間のものはそれほど簡単ではありません。問題は、cellForRowAtIndexPathがこれらの中間セルに対して2回呼び出されることです。これは、最初のセルから最後のセルにスクロールしてから戻るように見えるものです。その行に対してcellForRowAtIndexPathが起動するので、インデックスを順番にリストしました。

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は、表示されていない場合でも次のセルをロードし、表示されているセルの一部にします。

16
4thSpace

さて、あなたが解決策を見つけられなかったという偶然の機会に、または次にこの質問に来る人のために、私はあなたが探していた答えをあなたに提供します。 UITableViewは、探しているindexPathを提供し、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.
45
Douglas Mayle

ダグラスの例をSwiftに変換しました:

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)!)
}
2
Daniel Nord

UITableViewがセルを要求するタイミングに焦点を合わせるのではなく、デリゲートメソッドtableView:willDisplayCell:forRowAtIndexPathで示されるセルを表示するタイミングに焦点を合わせる必要があります。

2
Rob Napier

UITableViewの可視セルを取得するためのシンプルでエレガントな方法、indexpath値を使用して可視セルを取得する必要はありません

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

indexpathの可視セルが必要な場合

NSArray * paths = [tableView indexPathsForVisibleRows];
0
Aamir