Некорректное отображение данных ячейки при прокрутке UITableView - PullRequest
1 голос
/ 10 мая 2011

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

Ответы [ 5 ]

7 голосов
/ 17 мая 2011
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
7 голосов
/ 10 мая 2011

Вот код для правильного повторного использования ячейки:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {        
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text =  [array objectAtIndex:indexPath.row];

    return cell;
}

Если вы предоставите свой код, мы можем изменить его вместо предоставления общих примеров.

4 голосов
/ 10 мая 2011

Если вы создали пользовательскую ячейку, вам может потребоваться реализовать prepareForReuse в вашем подклассе UITableViewCell, чтобы очистить данные ячейки.

1 голос
/ 19 ноября 2013

У меня была такая же проблема на iOS 7 и раскадровке, хотя у меня никогда не было этой проблемы с тем же кодом на старших версиях Xcode-SDK, и, пробуя множество предложений от stackoverflow, я не мог это исправить, и угадайте, что ?!Apple TableView Programming Guide содержит подробное руководство.Нет даже необходимости использовать cell==nil.

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

Первый подход

  1. Создайте проект с помощью шаблона приложения Master-Detail и выберите параметр «Использовать раскадровки».
  2. На холсте раскадровки выберите главный контроллер вида.
  3. В инспекторе удостоверений убедитесь, что для класса задан пользовательский класс MasterViewController.
  4. Выберите представление таблицы внутри основного контроллера вида..
  5. В инспекторе атрибутов убедитесь, что во всплывающем меню «Содержимое» установлено значение «Динамические прототипы».
  6. Выберите ячейку прототипа.
  7. В инспекторе атрибутов выберите «Пользовательский».во всплывающем меню «Стиль».
  8. Введите идентификатор повторного использования в текстовое поле «Идентификатор».Это тот же идентификатор повторного использования, который вы отправляете в табличное представление в сообщении dequeueReusableCellWithIdentifier:.
  9. Выберите «Индикатор раскрытия» во всплывающем меню «Аксессуар».
  10. Перетащите объекты из библиотеки в ячейку.,В этом примере перетащите два объекта метки и расположите их ближе к концам ячейки (оставляя место для дополнительного вида).
  11. Выберите объекты и установите их атрибуты, размеры и характеристики автоматического изменения размера.

Важным атрибутом для программной части этой процедуры является свойство tag каждого объекта.Найдите это свойство в разделе View Attributes inspector и присвойте каждому объекту уникальное целое число.

Теперь напишите код, который вы обычно пишете, чтобы получить данные табличного представления.(Для этого примера единственными данными, которые вам нужны, является номер строки каждой ячейки.) Реализуйте метод источника данных tableView: cellForRowAtIndexPath: чтобы создать новую ячейку из прототипа и заполнить ее данными, аналогично следующему коду:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

    UILabel *label;

    label = (UILabel *)[cell viewWithTag:1];
    label.text = [NSString stringWithFormat:@"%d", indexPath.row];

    label = (UILabel *)[cell viewWithTag:2];
    label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];

    return cell;
}

Обратите внимание на несколько аспектов этого кода:

  • Строковый идентификатор, который вы присваиваете ячейке прототипа, - это та же строка, которую вы передаете в табличное представление в dequeueReusableCellWithIdentifier:.
  • Поскольку ячейка прототипа определена в раскадровке, метод dequeueReusableCellWithIdentifier: всегда возвращает действительную ячейку.Вам не нужно проверять возвращаемое значение по nil и создавать ячейку вручную.
  • Код получает метки в ячейке, вызывая viewWithTag:, передавая их целые числа тегов.Затем он может установить текстовое содержание меток.

Второй подход

Если вы предпочитаете не использовать тегиВы можете использовать альтернативный метод для установки содержимого в ячейке.Определите пользовательский подкласс UITableViewCell со свойствами выхода для объектов, которые вы хотите установить.В раскадровке свяжите новый класс с ячейкой прототипа и подключите розетки к соответствующим объектам в ячейке.

Чтобы использовать розетки для пользовательского содержимого ячейки

  1. Добавьте класс Objective C с именем MyTableViewCell в ваш проект.
  2. Добавьте следующий код к интерфейсу в MyTableViewCell.h:

    @ interface MyTableViewCell: UITableViewCell

    @ свойство (неатомное, слабое) IBOutlet UILabel * firstLabel;@property (неатомный, слабый) IBOutlet UILabel * secondLabel;@ end

  3. Добавьте следующий код к реализации в MyTableViewCell.m:

    @ syntheize firstLabel, secondLabel;

  4. Добавьте следующую строку кода в исходный файл, который реализует источник данных:

    # import "MyTableViewCell.h"

  5. Используйте Identity inspector, чтобы установить класс ячейки прототипа на MyTableViewCell.

  6. Используйте инспектор соединений, чтобы соединить два выхода в ячейке прототипа с соответствующими метками,enter image description here

  7. Реализация метода источника данных tableView:cellForRowAtIndexPath:

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
    
    cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
    cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
    
    return cell;
    }
    

Код получает доступ к меткам в ячейке с помощью средства доступаметоды (здесь используется точечная запись).Затем код может установить текстовое содержание меток.

0 голосов
/ 19 ноября 2012

Старый, но все же ... Я столкнулся с этой проблемой.Если другие увидят эту проблему однажды.Я не заметил и не помню, почему я это сделал, но я написал конфигурацию ячейки ВНУТРИ теста if (cell == nil) вместо того, чтобы писать ее ПОСЛЕ.Должно быть, я устал в этот день ...

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