Почему мой UITableView не использует прототипы для ячеек?

так вот мой код и он не работает

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier;
    if (indexPath.row == 0)
    {
        // buttonCell
        CellIdentifier = @"buttonCell";
        buttonCell *cell = (buttonCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
        cell.startAddressLabel.text = @"something";

        //cell config
        //debug
        NSLog(@"indexPath.row: %d", indexPath.row);
        NSLog(@"Cell Identifier: %@", CellIdentifier);

        return cell;
    } else if (indexPath.row == 1)
    {
        //mutableCaptionCell date&time
        CellIdentifier = @"mutableCaptionCell";
        mutableCaptionCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        //cell config
        cell.infoLabel.text = @"Время и дата";
        cell.contentLabel.text = @"";

        //debug
        NSLog(@"indexPath.row: %d", indexPath.row);

        return cell;

    } else if (indexPath.row == 2)
    {
        //mutableCaptionCell tax
        CellIdentifier = @"mutableCaptionCell";
        mutableCaptionCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        //cell config
        cell.infoLabel.text = @"Тариф";
        cell.contentLabel.text = @"";

        //debug
        NSLog(@"indexPath.row: %d", indexPath.row);

      return cell;
    } else if (indexPath.row == 3)
    {
        //mutableCaptionCell car
        CellIdentifier = @"mutableCaptionCell";
        mutableCaptionCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        //cell config
        cell.infoLabel.text = @"Выбор машины на карте";
        cell.contentLabel.text = @"";

        //debug
        NSLog(@"indexPath.row: %d", indexPath.row);

        return cell;
    } else if (indexPath.row == 4)
    {
        //wishCell wishlist
        CellIdentifier = @"wishCell";
        WishCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        //cell config
        cell.infoLabel.text = @"Пожелания";
        cell.contentLabel.text = @"";

        //debug
        NSLog(@"indexPath.row: %d", indexPath.row);

        return cell;
    } else
    {
        //debug
        NSLog(@"indexPath.row: %d", indexPath.row);
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"mutableCaptionCell" forIndexPath:indexPath];

        // Configure the cell...
        cell.textLabel.text = @"ERROR CELL";

        //debug
        //NSLog(@"indexPath.row: %d", indexPath.row);

        return cell;

        ;
    }

}

Я сказал, что подклассы UITableViewCell для каждого прототипа, идентификаторы повторного использования соответствуют каждому прототипу, но то, что я вижу во время выполнения, похоже, что UITableView не использует эти прототипы. Например, первая ячейка должна быть огромной с двумя кнопками, а вместо этого отображается пустой. Я NSLoged все, и журнал показывает это:

2014-02-18 10:13:51.587 app[1624:70b] indexPath.row: 0
2014-02-18 10:13:51.590 app[1624:70b] Cell Identifier: buttonCell
2014-02-18 10:13:51.594 app[1624:70b] cell: <buttonCell: 0x8b95e00; baseClass = UITableViewCell; frame = (0 0; 320 44); autoresize = W; layer = <CALayer: 0x8b96000>>
2014-02-18 10:13:51.600 app[1624:70b] indexPath.row: 1
2014-02-18 10:13:51.603 app[1624:70b] indexPath.row: 2
2014-02-18 10:13:51.606 app[1624:70b] indexPath.row: 3
2014-02-18 10:13:51.610 app[1624:70b] indexPath.row: 4

но все же TableView не использует правильные прототипы.

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

Примечание: я использую Xcode 5 для iOS 7


person Bacterial    schedule 18.02.2014    source источник


Ответы (2)


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

person Community    schedule 18.02.2014
comment
Я использовал статические ячейки на предыдущей итерации, но теперь мне нужно изменить высоту некоторых ячеек во время выполнения, как я упоминал выше. Есть ли способ сделать это? Одна из ячеек приведет к другой сцене со списком параметров, и я должен отобразить выбранные параметры обратно в эту ячейку, поэтому необходимо изменить высоту. - person Bacterial; 18.02.2014
comment
Это может вам помочь....stackoverflow.com/questions/3737218/ - person ; 18.02.2014
comment
спасибо за вашу помощь, я возвращаюсь к решению со статическими ячейками, потому что решение с .xibs при использовании раскадровки кажется мне неправильным, этого не должно быть: поскольку они реализовали раскадровку, вся работа должна выполняться с раскадровкой - person Bacterial; 18.02.2014

Я предполагаю, что вы не инициализируете свою ячейку, dequeueReusableCellWithIdentifier недостаточно. Он повторно использует уже созданные ячейки, поэтому вам следует сначала выделить cell, если удаление из очереди приводит к nil.

Возможно:

if (indexPath.row == 0)
{
    // buttonCell
    CellIdentifier = @"buttonCell";
    buttonCell *cell = (buttonCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


   if(!cell)
   {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:CellIdentifier];
   }

    cell.startAddressLabel.text = @"something";

    //cell config
    //debug
    NSLog(@"indexPath.row: %d", indexPath.row);
    NSLog(@"Cell Identifier: %@", CellIdentifier);

    return cell;
}

Или тензодатчик, разработанный с использованием IB:

if (indexPath.row == 0)
{
    // buttonCell
    CellIdentifier = @"buttonCell";
    buttonCell *cell = (buttonCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


   if(!cell)
   {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:nil options:nil] objectAtIndex:0];   // Assign reuseIdentifier from IB
   }

    cell.startAddressLabel.text = @"something";

    //cell config
    //debug
    NSLog(@"indexPath.row: %d", indexPath.row);
    NSLog(@"Cell Identifier: %@", CellIdentifier);

    return cell;
}

Надеюсь, поможет!

person NeverHopeless    schedule 18.02.2014
comment
многие источники говорят, что больше нет необходимости проверять, действительно ли создана ячейка, в любом случае, ваш ответ не сработал, извините - person Bacterial; 18.02.2014
comment
Вам больше не нужно этого делать;) поскольку iOS 5 или 6 гарантированно возвращает действительную (т.е. инициализированную) ячейку. Согласно документу: Return Value A UITableViewCell object with the associated reuse identifier. This method always returns a valid cell. - person HAS; 18.02.2014
comment
Итак, он возвращает действительную ячейку, но сначала следует вызвать registerNib:forCellReuseIdentifier: developer.apple.com/library/ios/documentation/uikit/reference/: тогда попробуйте. - person NeverHopeless; 18.02.2014
comment
Нет, если вы используете раскадровки;) - person HAS; 18.02.2014
comment
Я использую раскадровку, поэтому у меня нет этих файлов .nib, должен ли я по-прежнему использовать этот метод? - person Bacterial; 18.02.2014
comment
Нет. Я никогда ими не пользовался. - person HAS; 18.02.2014
comment
Взгляните на эту тему: stackoverflow.com/questions/9245969/ - person NeverHopeless; 18.02.2014
comment
похоже, что ответом является использование отдельного .xib для ячейки, но логически это так странно: разве раскадровка не должна делать это автоматически? спасибо за ответы, ребята, сейчас попробую использовать отдельные .xib - person Bacterial; 18.02.2014
comment
@NeverHopeless, используя отдельный .xib, помог мне, спасибо за совет. - person Bacterial; 18.02.2014
comment
@NeverHopeless теперь у меня есть другая проблема: таблица показывает мои прототипированные ячейки, но не изменяет их размер, поэтому я вижу ячейки по умолчанию с частичным представлением моего содержимого, не могли бы вы помочь? - person Bacterial; 18.02.2014
comment
чтобы контролировать высоту ячейки, вы действительно должны обрабатывать ее с помощью источника данных. Посмотрите мои предложения здесь: stackoverflow.com/questions/21396907/ - person NeverHopeless; 18.02.2014