Я работал над проблемой, связанной с 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, когда позволит время.