Дублированные строки в табличном представлении

Я знаю, что есть подобные вопросы, но они не работают для меня!

У меня дублируются строки, и текст UILabel становится все жирнее и жирнее, когда пользователь возвращается на любую вкладку с табличными представлениями.

Вот код cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
CustomCell *cell = (CustomCell *)
[tableView dequeueReusableCellWithIdentifier:CellClassName];

if (cell == nil) 
{
    NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
    cell = [topLevelItems objectAtIndex:0];
}

cell.subnavName.text = [array objectAtIndex:[indexPath section]];

UIImageView *background = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"subnavigation_off.png"]];

[cell setBackgroundView:background];

background = [[UIImageView alloc] 
              initWithImage:[UIImage imageNamed:@"subnavigation_on.png"]];

cell.selectedBackgroundView = background;
[background release];

return cell;

} Что я могу сделать, чтобы избежать повторного добавления текста из UILabel в мои ячейки, когда пользователь возвращается на эту вкладку из другой? Я читал что-то об использовании тега, но не могу найти способ сделать это.

Большое спасибо!


person agapitocandemor    schedule 10.11.2011    source источник


Ответы (1)


Ооооочень классическая ошибка.

Проблема (как и всегда в вопросах TableView здесь) заключается в том, что вы неправильно используете механизм повторного использования TableViewCells.

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

Затем, вне "если" - то есть, является ли ячейка вновь выделенной или ячейкой, которая была переработана (из ранее выделенной, но больше не используемой ячейки), во всех случаях - заполните ячейку определенным содержимым это зависит от indexPath (текст, изображение и т. д.)

Прочтите Руководство по программированию табличных представлений в документации Apple и выполните поиск в StackOverflow. Там много вопросов о табличных представлениях, и все они имеют одну и ту же проблему.

person AliSoftware    schedule 10.11.2011
comment
Я изменил его, и он все еще не работает, не могли бы вы отредактировать мой код выше? Чем заранее. - person agapitocandemor; 14.11.2011
comment
Я не вижу никаких правок/изменений в вашем коде выше. Примеры того, как это реализовать, ищите в StackOverflow о UITableView, есть много-много примеров кода о том, как реализовать tableView:cellForRowAtIndexPath: и эту ветку if, и я сам несколько раз объяснял это здесь. - person AliSoftware; 14.11.2011
comment
Хорошо, я изменил код своего приложения, а не там. Только что отредактировано. Спасибо :) - person agapitocandemor; 14.11.2011
comment
ВТФ?! Зачем весь этот бесполезный код? Цикл for, чтобы найти, какое значение i равно indexPath.section, вместо того, чтобы просто использовать indexPath.section напрямую?! И у вас есть утечки на первом изображении, которое вы назначаете в переменной background тоже... И все же до сих пор работает - это не диагностика. Не могу помочь без более подробной информации. Ставьте точки останова в свой код и отлаживайте его шаг за шагом (или NSLog), это должно быть более понятно для вас. - person AliSoftware; 14.11.2011
comment
WTF, разве вы не измените мой код, чтобы я научился делать это правильно, и мне не нужно было спрашивать снова? Спасибо за вашу помощь. Извините, потому что я не такой хороший программист, как вы. Я уверен, что вы не родились, зная, как программировать. - person agapitocandemor; 14.11.2011
comment
Я думаю, вы не поняли, как работает SO. SO — это не место для таких запросов, как заставить других писать ваш код за вас. Я не родился, зная, как программировать, поэтому я прошел множество уроков и прочитал книги. Не просил других писать код за меня. - person AliSoftware; 15.11.2011
comment
Да, я знаю, что вы не можете прийти сюда и сказать: Эй, пожалуйста, сделайте мое приложение! Но я пытаюсь решить эту небольшую проблему, и я не могу, я пытаюсь и не решаю свою проблему. Поэтому я спрашиваю. И я нахожу таких людей, как ты, которые только и отвечают, как ты можешь быть таким глупым и использовать этот код. Это не поможет, я уверен, ты не хочешь, чтобы с тобой так обращались. Спасибо за все. - person agapitocandemor; 15.11.2011