2014-09-26 7 views
1

Привет: У меня есть UITableView, который загружается из файла XIB, используя следующую строку:UITableView медленно загружается и повторно загружает ячеек

rulebookEditView = [[[NSBundle mainBundle] loadNibNamed:@"Rulebooks" owner:self options:nil] firstObject]; 

Вид затем добавляют как подвид, и функция режима представления класс, который регистрирует ячейки и загружает табличный вид:

[self.settingsTableView registerNib:[UINib nibWithNibName:@"RulebookEditorCell" bundle:nil] forCellReuseIdentifier:@"RulebookEditorCell"]; 
[self.settingsTableView registerNib:[UINib nibWithNibName:@"RulebookEditorXLCell" bundle:nil] forCellReuseIdentifier:@"RulebookEditorXLCell"]; 

//Get the data etc. 

[self.settingsTableView reloadData]; 

Теперь вот странная часть. Я ввел журнал в функцию cellForRowAtIndexPath:, чтобы зарегистрировать значение indexPath.row. Это в конечном итоге протоколирование следующее (я конденсируется его):

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
0 0 1 1 2 2 3 3 4 4 5 5 6 6 

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

Следует отметить, что на экране сразу отображаются 7 ячеек. Есть 21 ячейка, все в 1 разделе.

Я поставил точку останова на reloadData, и это действительно называется только один раз моим кодом.

Я предполагаю, что registerNib: заставляет просмотр таблицы обновляться, а также загружает его из файла XIB ...? Если да, есть ли способ предотвратить это или улучшить производительность? Потому что это вызывает около 500 мс задержки основного потока.

Спасибо!

ответ

0

Ненавижу говорить об этом, но это оказалось классическим случаем, когда он был счастлив с вызовом интенсивных функций. Моя heightForRowAtIndexPath: функция выглядит следующим образом:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    return ([[self tableView:tableView cellForRowAtIndexPath:indexPath] class] == [RulebookEditorXLCell class] ? 160 : 75); 
} 

Я изменил его на это, и он работает намного лучше:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    return ([self cellClassTypeForIndexPath:indexPath] == [RulebookEditorXLCell class] ? 160 : 75); 
} 

//Returns the class of the object that should be shown for a particular setting 
-(Class)cellClassTypeForIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath.row == 4 || indexPath.row == 9 || indexPath.row == 10 || indexPath.row == 11 || indexPath.row == 13 || indexPath.row == 14 || indexPath.row == 19 || indexPath.row == 20) { 

     //Return the large customized cell 
     return [RulebookEditorXLCell class]; 

    } else { 

     //Return the normal customized cell 
     return [RulebookEditorCell class]; 
    } 
} 

И, конечно же, журнал в настоящее время выводит:

0 1 2 3 4 5 6 

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

Мораль истории: не назовите cellForRowAtIndexPath в вашем методе heightForRowAtIndexPath.

+2

Это классическая ошибка - heightForRow никогда не следует вызывать cellForRow, но похоже, что это часто делается. –