Кадр UITableViewCell имеет значение NaN - PullRequest
0 голосов
/ 26 августа 2009

У меня есть пользовательский 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, который я получаю при прокрутке «пустой» ячейки.

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

1 Ответ

1 голос
/ 26 августа 2009

Этот раздел кода любопытен:

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];
}

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

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