Получение видимой ячейки из UITableView pagingEnabled

У меня есть 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 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 будет загружать следующую ячейку, даже если она не видна, заставляя ее быть частью видимых ячеек.

Ответы

Ответ 1

Хорошо, если бы вы никогда не выяснили решение или кто бы ни пришел к этому вопросу в следующий раз, я предоставлю вам ответ, который вы искали. 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

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

Ответ 3

Преобразованный пример Дугласа для 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)!)
}

Ответ 4

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

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

Если требуется indexpath видимых клеток

NSArray * paths = [tableView indexPathsForVisibleRows];