Как dequeueReusableCellWithIdentifier: лечить разные indexPath? - PullRequest
1 голос
/ 10 мая 2011

Давайте посмотрим некоторые стандартные коды таблицы

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier = @"Cell";
    static int count = 0;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        NSLog(@"count %d", count++);
    }
    // Configure the cell...
    cell.textLabel.text = [array objectAtIndex:indexPath.row];
    return cell;
}

Если у нас есть 10 элементов в массиве, то он выделит 10 ячеек для каждого indexPath.row

Мой вопрос как функция reuseIdentifier: CellIdentifier знает другую строку?

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

Если у нас есть 10 элементов в массиве, то он выделит 10 ячеек для каждого indexPath.row

Это не так - обычно количество выделенных ячеек будет NumberOfVisibleRows + 2 (илианалогичное значение).

Вот так (примерно) работает UITableView: как только определенная ячейка прокручивается из видимой области, она удаляется из иерархии представления UITableView (установите для свойства clipToBounds таблицы значение NO, и вы сможете это увидеть!) Ипомещается в какой-то внутренний кеш.dequeueReusableCellWithIdentifier: метод проверяет, доступна ли ячейка для повторного использования в этом кэше, и возвращает ее (и возвращает ноль, если ячейка недоступна) - поэтому вам не нужно выделять ячейки больше, чем фактически соответствует видимой области.

dequeueReusableCellWithIdentifier метод не зависит от текущего indexPath, скорее от идентификатора строки ячейки, который вы передаете ему.И indexPath используется только вами для получения соответствующего содержимого в ячейку.

0 голосов
/ 07 января 2013

О, метод **dequeueReusableCellWithIdentifier**: не имеет ничего общего с indexPath.

При использовании UITableView, мы используем [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault] reuseIdentifier:cellIdentifier], чтобы поместить очень китую ячейку в кеш (возможно, NSMutableDictionary) с ключом 'cellIdentifier'. И затем, когда нам нужна еще одна ячейка, мы сначала запрашиваем кеш, если пропущен, мы создаем новую.

indexPath является обязанностью кодера лечить. Вы разделяете различные виды ячеек по разделам и показывает ячейки строка за строкой в ​​одном разделе. Секция и строка составляют NSIndexPath .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...