Кадр UITableViewCell имеет значение NaN

У меня есть собственный 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, которая содержит три UILabels (имя магазина, расстояние и часы). Таким образом, этот код пытается удалить из очереди повторно используемую ячейку, и если это не удается, он создает новую, загружая ее из 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, который я получаю, когда «пустая» ячейка прокручивается в поле зрения.

Любые идеи о том, что может быть причиной этого?


person Community    schedule 25.08.2009    source источник


Ответы (1)


Этот участок кода любопытен:

if (cell == nil) {
            UIViewController *c = [[UIViewController alloc] initWithNibName:@"HOStoreOverviewCell" bundle:[NSBundle mainBundle]];
            cell = (HOStoreOverviewCell *)c.view;
    }

Почему вы выделяете здесь общий UIViewController? Для меня это выглядит как утечка памяти, так как никто не собирается ее освобождать.

Вы должны делать что-то еще вроде этого

if (cell == nil)
{
    cell = [[[HOStoreOverviewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease];
}

Ваша производительность пострадает, если вы загрузите ячейки таблицы из Nib. Вам гораздо лучше выделить их в коде. Я читал об этом несколько раз на форумах разработчиков Apple, а также испытал это на себе (использование Nibs приведет к тому, что ваша таблица будет «запаздывать»).

person Shaggy Frog    schedule 26.08.2009