Проблема с тем, как UITableViewCell создается UITableView на reloadData - PullRequest
0 голосов
/ 28 марта 2011

Я знаю, что есть похожие вопросы, но утвержденные ответы, похоже, не работают для меня. Итак, мой сценарий - у меня есть UITableView, и я хочу добавлять и удалять элементы, сканируя штрих-код. Все это прекрасно работает, за исключением того, что я не могу получить UITableView для отображения обновленной информации. Проблема, в частности, связана с методом tableView:cellForRowAtIndexPath: при каждой перезагрузке после начальной. Точнее говоря, ячейка всегда , а не nil, поэтому она пропускает новую логику создания ячейки.

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;

    if (indexPath.section < vehicle.inventoryCategoriesCount) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"ModelCell"];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ModelCell"] autorelease];

            NSString *model = [[[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"category == %@", [vehicle.inventoryCategories objectAtIndex:indexPath.section]]] valueForKeyPath:@"@distinctUnionOfObjects.model"] objectAtIndex:indexPath.row];

            cell.textLabel.text = model;
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", [[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"model == %@", model]] count]];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:@"RemoveCell"];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"RemoveCell"] autorelease];

            cell.textLabel.text = @"Remove an Item";
            cell.textLabel.textColor = [UIColor redColor];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }
    }

    return cell;
}

Итак, в этом примере кода у меня есть два разных идентификатора ячейки для отдельных разделов. Это ModelCell и RemoveCell . Ну, они не работают как решение, потому что ничего не происходит. Если я изменяю идентификатор ячейки при выделении новой ячейки, она работает, потому что она просто стирает все, поскольку идентификаторы не совпадают, но я собираюсь предположить, что это неправильно и что для этого должно быть лучшее решение. или я просто что-то не так делаю.

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

Заранее спасибо за любую помощь!

UPDATE

Благодаря @fluchtpunkt проблема была решена. Для всех, кто может столкнуться с этим в будущем, вот исправленный код. Я решил сделать идентификатор еще более уникальным, добавив к нему номер раздела.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;

    if (indexPath.section < vehicle.inventoryCategoriesCount) {
        NSString *identifier = [NSString stringWithFormat:@"ModelCell-%d", indexPath.section];

        cell = [tableView dequeueReusableCellWithIdentifier:identifier];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease];

            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }

        NSString *model = [[[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"category == %@", [vehicle.inventoryCategories objectAtIndex:indexPath.section]]] valueForKeyPath:@"@distinctUnionOfObjects.model"] objectAtIndex:indexPath.row];

        cell.textLabel.text = model;
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", [[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"model == %@", model]] count]];
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:@"RemoveCell"];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"RemoveCell"] autorelease];

            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.textLabel.textColor = [UIColor redColor];
        }

        cell.textLabel.text = @"Remove an Item";
    }

    return cell;
}

UPDATE

Окончательная версия кода, которая исправляет мое недопонимание того, как работает идентификатор. Я решил, что буду держать это просто, поэтому я назвал идентификаторы в честь типа стиля ячейки.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;

    if (indexPath.section < vehicle.inventoryCategoriesCount) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"Value1"];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Value1"] autorelease];

            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }

        NSString *model = [[[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"category == %@", [vehicle.inventoryCategories objectAtIndex:indexPath.section]]] valueForKeyPath:@"@distinctUnionOfObjects.model"] objectAtIndex:indexPath.row];

        cell.textLabel.text = model;
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", [[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"model == %@", model]] count]];
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:@"Default"];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Default"] autorelease];

            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.textLabel.textColor = [UIColor redColor];
        }

        cell.textLabel.text = @"Remove an Item";
    }

    return cell;
}

Ответы [ 3 ]

3 голосов
/ 28 марта 2011

выводит конфигурацию вашей ячейки за пределы if (cell == nil) { ... } Условие if является верным, только если ячейка не может быть повторно использована. И вы определенно хотите повторно использовать свои клетки. Настраивайте их, когда у вас есть действительная ячейка.

Как это:

if (indexPath.section < vehicle.inventoryCategoriesCount) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"ModelCell"];

    if (cell == nil) {
        // only create a new cell if a dequeue was not successful.
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ModelCell"] autorelease];
    }
    // whatever happened before you have a valid cell here.

    // configure cell:
    NSString *model = [[[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"category == %@", [vehicle.inventoryCategories objectAtIndex:indexPath.section]]] valueForKeyPath:@"@distinctUnionOfObjects.model"] objectAtIndex:indexPath.row];

    cell.textLabel.text = model;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", [[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"model == %@", model]] count]];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
} 

Если вы хотите оптимизировать свой код, вы можете переместить одинаковые параметры для каждой ячейки в условии (cell == nil). Например, установка selectionStyle или изменение цвета текста

0 голосов
/ 11 февраля 2014

Вы определенно используете свои клетки.если вы поместите свою конфигурацию внутрь if (cell == nil), она будет работать, если ни одна ячейка не будет использована повторно.поэтому, пожалуйста, поместите следующий фрагмент кода вне условия if (cell == nil) ------------

if (cell == nil) {`` // введите код здесь} NSString * model = [[[vehicle.inventory FilterArrayUsingPredicate: [NSPredicate ultimateateWithFormat: @ "category ==% @", [vehicle.inventoryCategories objectAtIndex: indexPath.section]]] valueForKeyPath: @ "@ diverUnionOfObjects.mode]]indexPath.row];

        cell.textLabel.text = model;
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", [[vehicle.inventory filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"model == %@", model]] count]];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
0 голосов
/ 29 июля 2011

Алекс - если я посмотрю на ваш код сверху, вы делаете это:

cell = [tableView dequeueReusableCellWithIdentifier:@"ModelCell"];

Однако для всех примеров (и моего кода) требуется статическая строка NSString для CellIdentifier

static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

Это тогда работает намеченным образом.

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