Перерисовка ячейки UITableView приводит к перекрытию текста - PullRequest
1 голос
/ 25 ноября 2011

Я делаю следующее в cellForRowAtIndexPath

NSString *cellIdentifier = @"Cell";
LibraryCell *cell = (LibraryCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell != nil) {
    [cellIdentifier release];
    [self setItems:cell forRowAtIndexPath:indexPath];
    return cell;
}
cell = [[[LibraryCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier] autorelease];
[self setItems:cell forRowAtIndexPath:indexPath];
return cell;

[self setItems:cell forRowAtIndexPath:indexPath]; изменяет только значение некоторого UILabel внутри соответствующей ячейки.

Так что теперь, когда я редактирую UITableView и удаляю, скажем, первыйстрока, значение UILabel не перерисовывается полностью, то есть старое значение остается, и новое значение рисуется поверх старого.Почему это происходит и как это исправить?

Ответы [ 3 ]

3 голосов
/ 25 ноября 2011

Полагаю, вы неправильно поняли концепцию идентификатора ячейки.Он используется только для того, чтобы отличить то, что вы могли бы назвать «штампами», используемыми для печати внешнего вида ячейки на экране.Таким образом, вам, скорее всего, потребуется только один идентификатор ячейки.

Это помогает системе кэшировать экземпляры «штампов».Когда вызывается cellForRowAtIndexPath, вам нужно только выбрать, какую марку вы хотите использовать.Если вы создали экземпляр правильного экземпляра ранее (т.е. вы получаете его обратно, когда запрашиваете его, используя строку идентификатора ячейки), вам нужно только изменить текст метки и т. Д., А затем вернуть его.В реальной жизни это можно сравнить с одной из тех марок даты, где вы можете изменить дату, поворачивая маленькие ручки на марке.Это то, что вы бы сделали, назначив новый текст метке, содержащейся в ячейке.

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

Я рекомендую прочитать документацию Apple или посмотреть iTunes U ( здесь ) для Стэнфордских курсов по разработке iOS.Там это объясняется очень четко.

2 голосов
/ 25 ноября 2011

Прежде всего, вы должны использовать то же имя для вашего cellIdentifier

Пожалуйста, обратитесь к UITableView Class reference http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:

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

LibraryCell *cell = (LibraryCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)  {
    //  create a new cell
    ...
}

//  Update cell
...

return cell;
0 голосов
/ 25 ноября 2011

На самом деле я разобрался! Проблема исходила из метода setItems:forIndextPath. Он создавал UILabel локально и выпускал его. Таким образом, каждый раз, когда он был нарисован поверх последнего текста. Создание переменной экземпляра UILable решило проблему.

PS. Код изначально не был написан мной, я просто исправляю его:)

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