dequeueReusableCell ... для 2 строк? - PullRequest
       1

dequeueReusableCell ... для 2 строк?

1 голос
/ 17 сентября 2011

почему мы используем dequeueReusableCellWithIdentifier, если ячейки и сечение занимают точно размер экрана или даже меньше высоты экрана: скажем, у нас есть 2 раздела, в каждом из которых только по 1 строке?

пример:

    switch (indexPath.section)
{
    case kMonitoringSection:
    {
        cell = [tableView dequeueReusableCellWithIdentifier:kMonitoringCellIdentifier];
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kMonitoringCellIdentifier] autorelease];
            cell.textLabel.text = NSLocalizedString(@"Monitoring", @"");

            UISwitch *switchCtl = [[[UISwitch alloc] initWithFrame:CGRectMake(197, 8, 94, 27)] autorelease];
            [switchCtl addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];
            switchCtl.backgroundColor = [UIColor clearColor];

            [cell.contentView addSubview:switchCtl];
        }

        break;
    }

    case kLevelSection:
    {
        cell = [tableView dequeueReusableCellWithIdentifier:kLevelCellIdentifier];
        UILabel *levelLabel = nil;
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kLevelCellIdentifier] autorelease];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            cell.textLabel.text = NSLocalizedString(@"Level", @"");

            levelLabel = [[[UILabel alloc] initWithFrame:CGRectMake(171, 11, 120, 21)] autorelease];
            levelLabel.tag = kLevelTag;
            levelLabel.textAlignment = UITextAlignmentRight;
            [cell.contentView addSubview:levelLabel];
            levelLabel.backgroundColor = [UIColor clearColor];
        }

в примере кода: BatteryStatus

если бы у нас было 20 строк, я бы понял смысл, но я не уверен, что здесь ...

Спасибо

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Если у вас есть только статическое количество ячеек, скажем, только две (разные) ячейки в вашем табличном представлении, и ни одна ячейка не повторяется, вам следует вместо этого создать две ваши ячейки в XIB (и спроектировать их там с вашим UISwitch для первого и вашим пользовательским UILabel для другого) и укажите на него IBOutlet .

Намного проще, меньше кода и имеет смысл, когда повторное использование ячеек не требуется.

Прочтите Руководство по программированию Apple Table View , которое является действительно замечательным ресурсом (как и практически любое Руководство по программированию в документе Apple) и объясняет все это в деталях. В частности, часть " Техника для Статического Содержания Строки " объясняет этот точный случай использования.


Так что, конечно, вы можете использовать dequeueReusableCellWithIdentifier, в таком случае это не повредит (и, вероятно, в образце BatteryStatus они сделали это, потому что не задавались вопросом, было ли это действительно полезно или нет просто как привычка, потому что они делают это все время, когда у них больше рядов), но это не лучший способ сделать это.

Обратите внимание, что примеры кодов, предоставляемые Apple, не всегда решение , которому нужно следовать: они просто один способ сделать sthg, и особенно образец, как правило, имеют тенденцию фокусироваться на функциональности он хочет проверить (в данном случае состояние батареи) и не беспокоится ни о чем другом (особенно о производительности - за исключением, если образец, конечно, о производительности).

1 голос
/ 17 сентября 2011

Бесполезно тратить время на создание новой ячейки с нуля каждый раз, когда вызывается tableView:cellForRowAtIndexPath:, поэтому я думаю, что вы захотите где-то сохранить свои две ячейки.

Вы можете сделать это любым способом, который вам действительно нужен, но любое общее решение для кэширования ячеек будет похоже на dequeueReusableCellWithIdentifier:, и любое менее общее решение может помешать вам, если требования изменятся.Вы не платите значительную производительность или читабельность за использование dequeueReusableCellWithIdentifier: в вашем примере, так что беспокоиться об этом?

1 голос
/ 17 сентября 2011

Вам не нужно звонить, если вы не хотите. Это не обязательный метод или что-то в этом роде. Шаблоны вставляют его для вас, и многие примеры используют его, потому что он просто есть, и если вы увеличиваете таблицу, вам не нужно добавлять какие-либо методы.

Не звоните, если считаете, что вам это не нужно.

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