У меня есть пользовательский UITableViewCell, который я создал в IB. Чтобы заполнить UITableView экземплярами этих ячеек, загруженными из NIB, я использую следующий код:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"overviewCell";
HOStoreOverviewCell *cell = (HOStorwOverviewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
UIViewController *c = [[UIViewController alloc] initWithNibName:@"HOStoreOverviewCell" bundle:[NSBundle mainBundle]];
cell = (HOStoreOverviewCell *)c.view;
}
HOStore *itemAtIndex = (HOStore *)[self.infoController storeInListAtIndex:indexPath.row];
cell.storeName.text = itemAtIndex.name;
cell.distance.text = [itemAtIndex niceDistance];
cell.hours.text = [itemAtIndex.currentHour niceHours];
NSLog(@"%@", cell);
return cell;
}
HOStoreOverviewCell - это мой пользовательский UITableViewCell в NIB, который содержит три UILabel (storeName, distance и часы). Таким образом, этот код пытается удалить из очереди многократно используемую ячейку, и если он не может, он создает новую, загружая ее из NIB. Затем он устанавливает текст UILabels в соответствующие биты информации от элементов (HOStore) в массиве. Довольно стандартные вещи.
Моя проблема заключается в следующем: большинство ячеек отображаются правильно, но время от времени (я не смог надежно воспроизвести это) UITableView будет «пропускать» ячейку - например, он отображает 10-ю ячейку 12-я ячейка, но не 11-я ячейка. Вместо этого есть пустое место, где должна быть 11-я ячейка, и постукивание по этому месту не дает никакого эффекта. Нажатие в любом месте ниже пустого места даст мне метод делегата didSelectRowAtIndexPath: indexPath, где indexPath.row всегда имеет отсутствующий индекс (например, 11).
Корень проблемы появляется при просмотре вывода NSLog (отрывок):
2009-08-26 00:22:29.292 AppName[380:207] <HOStoreOverviewCell: 0x42c9880; baseClass = UITableViewCell; frame = (0 660; 320 66); autoresize = W; layer = <CALayer: 0x42c9a60>>
2009-08-26 00:22:30.331 AppName[380:207] <HOStoreOverviewCell: 0x42c9880; baseClass = UITableViewCell; frame = (0 nan; 320 66); autoresize = W; layer = <CALayer: 0x42c9a60>>
2009-08-26 00:22:32.138 AppName[380:207] <HOStoreOverviewCell: 0x42c71d0; baseClass = UITableViewCell; frame = (0 594; 320 66); autoresize = W; layer = <CALayer: 0x42c73b0>>
Обратите внимание на номер кадра во второй строке. Это соответствует обратному вызову cellForRowAtIndexPath: indexPath, который я получаю при прокрутке «пустой» ячейки.
Есть идеи о том, что может быть причиной этого?