2013-11-26 2 views
1

У меня есть приложение с UIViewController, содержащее UITableView, с использованием пользовательской ячейки представления таблицы. Я использовал ту же собственную таблицу представления таблицы с UITableViewControllers успешно, но на этот раз это UITableView в UIViewController. Мои первые мысли заключались в том, что это действительно должно быть не иначе. Однако по какой-то причине в моей cellForRowAtIndexPath при начальной загрузке «cell» не является нулевым, как и должно быть, поэтому код для создания экземпляра пользовательской ячейки никогда не вызывается.Пользовательская проблема UITableViewCell в UITableView

Я создал пользовательскую ячейку как с помощью построителя интерфейса, так и вручную с его идентичными результатами. Единственное примечательное различие заключается в том, что код работает правильно при использовании его с UITableViewController, но сбой при использовании его с UIView, содержащим UITableView.

Я проверил, что мой идентификатор ячейки настроен правильно, и мой источник данных и делегаты правильно установлены в моем UIViewController. Пользовательская ячейка правильно настроена подкласса.

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

FaveCell *cell = (FaveCell*)[tableView dequeueReusableCellWithIdentifier:cellID]; 
if(cell == nil){ 
    // this line of code is never reached 
    cell = [[FaveCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; 
} 

/* code to load controls 

... 

*/ 

return cell; 
} 

Итак, когда код входит cellForRowAtIndexPath впервые, «клетка» должна быть нулевой, но это не так. Опять же, единственная заметная разница: UIView/UITableView vs UITableViewController. Это имеет смысл для всех? Может ли кто-нибудь предложить решение? Благодаря!

+0

У вас есть NIB для вашей пользовательской ячейки? – hgwhittle

+0

Да, для пользовательской ячейки есть наконечник – Pheepster

+0

В противном случае выглядит и ведет себя ваша таблица, и единственным симптомом является то, что код 'if (cell == nil)' не вводится? – dasblinkenlight

ответ

2

Однако, по какой-то причине в моем cellForRowAtIndexPath:, при начальной загрузке, cell не nil, как это должно быть, поэтому код для создания экземпляра пользовательских ячеек никогда не вызываются.

Это потому, что UITableView стал умнее от прошивки 5.0: если вы сообщите ему, какой тип клеток вы хотите указать тип пользовательской ячейки, он создает их для вас, так что if(cell == nil) код не действительно не вступало. Из documentation:

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

+0

Это объясняет, почему версия, которую я создал с помощью ниба, не работает должным образом. Но я также создал пользовательскую ячейку жестким кодированием. Это дало те же результаты. Жестко закодированная версия корректно работала в контроллере табличного представления, но не в виде таблицы. – Pheepster

+0

Кажется, что не проверка на ячейку nil будет конфликтовать с dequeueReusableCellWithIdentifier – Pheepster

+0

@Pheepster Я держу проверку в своем коде, на случай, если Apple решит сделать что-то новое (и несовместимо) с их внедрением метода 'dequeueReusableCellWithIdentifier:'. Пока экземпляр - это единственное, что вы делаете внутри этого 'if', это не повредит (если вы не полагаетесь на конкретный инициализатор, который вызывается внутри' if', и это * not * тот же самый инициализатор, вызываемый табличным представлением). – dasblinkenlight

Смежные вопросы