2015-02-27 2 views
1

У меня есть UITableViewController в Раскадровке в моем проекте iOS. У меня есть специальный TableViewCell MessageCell с UIView внутри определенного класса.Ошибка в iOS с UITableViewCells?

Когда я называю tableView.dequeueReusableCellWithIdentifier: я получаю UITableViewCell только с этим подвидом дерева:

<UITableViewCell: 0x16da5e90; frame = (0 0; 0 0); layer = <CALayer: 0x16da5120>> 
    <UITableViewCellContentView: 0x16da6210; frame = (0 0; 0 0); clipsToBounds = YES; opaque = NO; gestureRecognizers = <NSArray: 0x16da5510>; layer = <CALayer: 0x16da6280>> 
    <_UITableViewCellSeparatorView: 0x16da62b0; frame = (0 -1; 15 1); layer = <CALayer: 0x16da52d0>> 

Но когда я называю tableView.dequeueReusableCellWithIdentifier:forIndexPath, я получаю это подвид дерева:

<UITableViewCell: 0x146f3a90; frame = (0 148.93; 320 54.93); autoresize = W; layer = <CALayer: 0x146f2ff0>> 
    <UITableViewCellContentView: 0x146f3020; frame = (0 0; 320 54.43); opaque = NO; gestureRecognizers = <NSArray: 0x146f3e90>; layer = <CALayer: 0x146f3180>> 
     <Heaven_Help.MessageView: 0x146f3f70; frame = (0 0; 320 568); autoresize = W+H; tag = 99; layer = <CALayer: 0x146f4af0>> 
      <UIImageView: 0x146f4010; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x146f4090>> 
      <UILabel: 0x146f40c0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x146f4180>> 
      <UILabel: 0x146f42d0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x146f4390>> 
    <_UITableViewCellSeparatorView: 0x146f31b0; frame = (0 -1; 15 1); layer = <CALayer: 0x146f3c20>> 
    <_UITableViewCellSeparatorView: 0x146f5170; frame = (0 -0.5; 16 0.5); layer = <CALayer: 0x146c1f40>> 

UIImageview и 2 UILabels прибудут добавлен в мой инициализатор MessageView.

Кто может сказать мне, что я не получаю?

В соответствии с просьбой: мой код из tableView:cellForRowAtIndexPath::

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("MessageCell", forIndexPath: indexPath) as UITableViewCell 
    (cell.viewWithTag(99) as MessageView).setMessage(conversation[indexPath.row]) 
    return cell 
} 

ответ

1

Короче говоря, не используйте dequeueReusableCellWithIdentifier:.

dequeueReusableCellWithIdentifier: возвращается:

UITableViewCell объект с идентификатором или ассоциированного nil, если не существует такого объекта в очереди многоразовые-клеток.

Этот метод обычно используется в схеме, как это без раскадровки: (. С помощью видеоредактора, метод будет всегда возвращать ячейку)

MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"messageCell"]; 

if (!cell) { 
    cell = [[MessageCell alloc] initWithStyle:…reuseIdentifier:@"messageCell"]; 
    // set properties that are true for EVERY cell 
} 

// set properties from your data model for THIS cell (usually strings and images) 

return cell; 

более новых методов (например, dequeueReusableCellWithIdentifier:forIndexPath:) гарантированно возвратит ячейку, поэтому вам больше не нужно использовать этот шаблон.

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

+0

Я ожидаю 'UITableViewCell', но я должен получить тот, который содержит пользовательский' UIView', и я этого не делаю. Я не понимаю, что происходит, но я буду использовать 'dequeueReusableCellWithIdentifier: forIndexPath:' отныне. – vrwim

+0

Если вы обновите свой вопрос своим кодом из 'tableView: cellForRowAtIndexPath:' Я мог бы расширить свой ответ, чтобы объяснить. –

+0

То, что я всегда делал, было в 'tableView: cellForRowAtIndexPath' просто вызывает' [tableView dequeueReusableCellWithIdentifier: @ "MessageCell"] ', и в моей раскадровке создаются прототипы ячеек, которые мне нужны. Я никогда не нуждался в 'initWithStyle: reuseIdentifier', поскольку я сделал ссылку в своем раскадровке. В этом случае у меня даже нет пользовательского 'UITableViewCell', но только прототип, который содержит пользовательский' UIView', который мне нужен. Поэтому я не думаю, что добавление этого кода поможет, но я добавил его в любом случае. – vrwim

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