Получение видимой ячейки из UITableView pagingEnabled - PullRequest
16 голосов
/ 15 июня 2009

У меня есть UITableView с pagingEnabled. Каждая ячейка занимает область просмотра таблицы. Это означает, что каждая ячейка имеет ту же высоту и ширину, что и таблица. Я использую пользовательские ячейки, которые имеют свойство name. Я хотел бы отобразить имя текущей (видимой) ячейки в метке. Это прекрасно работает для первой и последней ячеек, но между ними не все так просто. Проблема в том, что cellForRowAtIndexPath вызывается дважды для этих средних ячеек. Вот как выглядит прокрутка от первой до последней ячейки, а затем обратно. Я перечислил индексы по порядку, так как 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 загрузит следующую ячейку, даже если она не видна, в результате чего она станет частью видимых ячеек.

Ответы [ 4 ]

44 голосов
/ 14 октября 2009

Что ж, если вы не нашли решение, или если кто-то ответит на этот вопрос позже, я предоставлю вам ответ, который вы искали. 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.
2 голосов
/ 30 сентября 2015

Преобразованный пример Дугласа в 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 голосов
/ 15 июня 2009

Вместо того, чтобы сосредотачиваться на том, когда UITableView запрашивает ячейку, вы должны сосредоточиться на том, когда он отображает ячейку, что указано методом делегата tableView:willDisplayCell:forRowAtIndexPath.

0 голосов
/ 17 июня 2016

Простой и элегантный способ получения видимых ячеек UITableView, не нужно получать видимые ячейки, используя indexpath значения

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

Если нужны indexpath видимых ячеек

NSArray * paths = [tableView indexPathsForVisibleRows];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...