Как повторно инициализировать ячейку в uitableview без дублирования значения? - PullRequest
0 голосов
/ 14 февраля 2011

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

CellForClient  *cell = (CellForClient *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
    {
        cell = [[[CellForClient alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
    }

Любое решение? Заранее спасибо.

EDIT:

@ Erik B & RedBlueThing: Спасибо за ваш ответ, но это то, что я уже делаю и получаю дублированное значение, поскольку я использую reuseIdentifier для инициализации ячейки. Позвольте привести пример: в моей таблице 6 строк. Каждая ячейка содержит 7 внутренних значений, таких как имя, фамилия и некоторые другие детали. Итак, в начале я показываю 3 ячейки при загрузке таблицы. Когда я прокручиваю таблица вниз и вверх, данные последних строк перезаписывают верхние значения, и при каждой прокрутке значения перезаписываются.

Любое решение этой проблемы.

Ответы [ 3 ]

3 голосов
/ 14 февраля 2011

Вот как вы должны это сделать:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

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

    // Configure the cell...
    cell.textLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];

    return cell;
}

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

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

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

@interface SystemCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *systemLbl;    
@end

В cellForRowAtIndexPath вместо указанного UITableViewCell

    static NSString *cellIdentifier = @"cell";
    SystemCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell=[[SystemCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

//other code

UILabel *systemLbl = cell.systemLbl;
systemLbl.text = systemName;

return cell;

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

Надеюсь, эта справка для тех, у кого возникла похожая проблема.

0 голосов
/ 14 февраля 2011

Вы должны воспользоваться повторным использованием ячеек с вашим UITableView.Просто убедитесь, что вы устанавливаете свойство textLabel.text в ячейке на новое значение.

Таким образом, строка после оператора if должна быть:

cell.textLabel.text = data for this row ...

Вы можете проверить, что это работаетустановив для текста что-то узнаваемое:

cell.textLabel.text = [NSString stringWithFormat:@"row %d", indexPath.row];

Таким образом, даже если вы повторно используете ячейки, вы получите «строку 0», «строку 1» и т. д.

Редактировать для обновления

Таким образом, вам необходимо убедиться, что вы переустанавливаете все внутренние значения после получения объекта ячейки, либо из выделения, либо из dequeueReusableCellWithIdentifier .

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