UITableViewCell cellForRowAtIndexPath, вызывающий большое количество строк при первой прокрутке - PullRequest
3 голосов
/ 28 октября 2010

Я работал над проблемой, связанной с UITableView и cellForRowAtIndexPath.

Я хочу дать пользователю возможность иметь очень большое количество строк, как большой список электронной почты на iPhone. Я обнаружил эту проблему, когда начал создавать класс, который, при необходимости, помещал в очередь и удалял группы записей из базы данных, чтобы сохранить память. Я обнаружил, что когда загружается мой UITableViewController, он вызывает cellForRowAtIndexPath для типичных первых 10 индексов (от 0 до 9). Проблема возникает, когда я либо щелкаю мышью по черной области внешней поверхности симулятора, либо пытаюсь прокрутить UITableView вниз, используя жест вверх. На этом этапе cellForRowAtIndexPath вызывается для всех остальных индексов. Это происходит, даже если есть более 1000 клеток. Я попытался воссоздать ОЧЕНЬ ПРОСТОЙ проект только с 100 индексами (ничего особенного). Он делает то же самое .. как только я прокручиваю, он вызывает cellForRowAtIndexPath с позиций 10 до 99.

Это нормальное поведение UITableView? У кого-нибудь есть идеи, почему он неэффективно вызывает все строки?

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

Вот код моего гораздо более простого примера проекта:

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 return 100;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


 printf("RootViewController, -tableView:cellForRowAtIndexPath; // indexPath.row = %d\n", indexPath.row);


    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

 cell.textLabel.text = @"Example Text";

 return cell;  
}

Консоль

...... Начальная загрузка просмотра ......

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 0

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 1

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 2

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 3

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 4

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 5

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 6

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 7

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 8

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 9

...... Жест первого свитка ......

ootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 11

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 12

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 13

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 14

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 15

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 16

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 17

. , Я убрал несколько здесь, чтобы сократить , .

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 97

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 98

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 99

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 10

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 11

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 12

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 13

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 14

RootViewController, -tableView: cellForRowAtIndexPath; // indexPath.row = 15

RootViewController, -tableView: cellForRowAtIndexPath;// indexPath.row = 16

(gdb)

Спасибо за помощь> Сегодня я подумал попробовать реальное устройство вместо моего симулятора.Мой iPhone 3GS не воспроизводит это странное поведение.Я полагаю, что что-то не так с симулятором на моей машине.Я планирую попробовать другой MAC, когда позволит время.

Ответы [ 3 ]

12 голосов
/ 11 ноября 2010

Причиной этой проблемы было приложение, которое я установил на моем Mac под названием Cinch.

Cinch - это приложение для управления окнами, которое добавляет функцию «привязки» окон к Mac OS.Программа отлично работает в противном случае.Всякий раз, когда я работаю с путем cellForRowAtIndex, мне просто нужно помнить, чтобы отключить Cinch.

К сожалению, мне пришлось перезагрузить весь компьютер, чтобы понять это!Надеюсь, что это полезно для всех, кто испытывает эту странную функциональность.

1 голос
/ 24 мая 2011

на тот случай, если у некоторых есть та же странная проблема и не установлена ​​программа, подобная chinch: то же самое происходит, если вы не используете действительно отдельный идентификатор ячейки ... если вы просто используете стандартный идентификатор из примеров Apple тогда это не сработает.

каждый раз, когда вы скользите по таблице, появляются записи, вращающиеся вокруг. Вы должны сделать свои идентификаторы ячейки уникальными для каждой ячейки. eg.:

 NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.row];

Мне потребовалось некоторое время, чтобы понять это ... поэтому, если кто-то найдет эту ветку, как я, при поиске "uitableview uitableviewcell Странное поведение переключателя содержимого на сенсорном слайде", он может проверить этот возможный источник ошибки ..

0 голосов
/ 28 августа 2012
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
    }

используйте этот nil для повторного идентификатора, чтобы он работал правильно

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