2014-02-16 4 views
0

Я использую Xcode 5 и разрабатываю приложение, ориентированное на iOS6/7.UITableViewCell не показывает контент

В моей раскадровке «ячейки прототипа», которые относятся к пользовательскому классу «ObjListCell», полученному из «UITableViewCell», содержит «Content View», который, в свою очередь, содержит UIImageView и два элемента UILabel. Все три из них связаны с IBOutlet в моем классе ObjListCell.

Контроллер табличного представления относится к моему пользовательскому классу «ObjListViewController», полученному из «UITableViewController». Когда этот контроллер представления создан, я уже извлек данные, поэтому в viewDidLoad я сразу вызову [self.tableView reloadData];. Но прежде чем это сделать, я зарегистрирую класс ячеек: [self.tableView registerClass: [ObjListCell class] forCellReuseIdentifier:@"objTableCell"]; и «objTableCell» установлен в раскадровке как идентификатор для ячеек.

Номер методаOfRows в разделе возвращает 14, и на самом деле я вижу список из 14 пустых строк на моем iPhone. Как видно из журналов, метод cellForRowAtIndexPath фактически вызывается, а метод dequeueReusableCellWithIdentifier возвращает ячейку non-nil. Поэтому я поставил значок и содержание этикетки:

cell.mCellIcon.image = icon; 
cell.mCellTitle.text = title; 
cell.mCellExtra.text = extra; 

я уверен, значок и текст в порядке, потому что я вхожу их только перед назначением их. Но, тем не менее, мои ячейки таблицы кажутся пустыми.

Может ли кто-нибудь предложить, где может быть проблема?

Это весь код cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"objTableCell"; 
    ObjListCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 
    if (cell == nil) 
     NSLog(@"ObjListViewController ERROR: Cell is nil"); 

    // Retrieve obj for this cell 
    Obj* obj = [mObjs objectAtIndex:indexPath.row]; 
    if (obj == nil) 
     NSLog(@"ObjListViewController ERROR: Obj not found for cell; indexPath = %i", indexPath.row); 
    NSLog(@"ObjListViewController DEBUG: title = %@, extra = %@", obj.mTitle, obj.mExtra); 

    // Set cell icon 
    UIImage *icon = [mIcons iconForId:obj.mId andSize:@"big" withDefault:@"defaultIcon"]; 
    if (icon == nil) 
     NSLog(@"ObjListViewController ERROR: Icon not found for cell; indexPath = %i", indexPath.row); 
    cell.mCellIcon.image = icon; 

    // Set cell title and extra 
    cell.mCellTitle.text = obj.mTitle; 
    if (obj.hasExtra) 
     cell.mCellExtra.text = obj.mExtra; 
    NSLog(@"ObjListViewController DEBUG: Inspecting cell content; icon = %@, title = %@, extra = %@", 
    (cell.mCellIcon.image != nil ? @"OK" : @"nil"), cell.mCellTitle.text, cell.mCellExtra.text); 

    // Standard accessory symbol 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    return cell; 
} 

И это отрывок из журнала:

2014-02-16 15:21:06.665 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: title = Valle d'Aosta, extra = 
2014-02-16 15:21:06.668 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: Inspecting cell content; icon = nil, title = (null), extra = (null) 
2014-02-16 15:21:06.685 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: title = Provincia di Belluno, extra = 
2014-02-16 15:21:06.690 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: Inspecting cell content; icon = nil, title = (null), extra = (null) 

Ни один из «ERROR» логах появляются в журнале.

+0

Вы изменили класс ячейки на свой собственный класс в IB? – giorashc

+0

Да, да. В раскадровке я имею в виду. Я только что пришел к выводу, что я не синтезировал три IBOutlets в моем файле ObjListCell.m, но после устранения проблемы эта проблема сохраняется. Я также добавил журнал, чтобы проверить значение cell.mCellIcon.image, cell.mCellTitle.text и cell.mCellExtra.text, после присвоения им их значения: они ноль! Но, как я уже сказал, правые данные до присвоений в порядке. –

+0

Добавьте 'NSLog (@"% @% @% @ ", cell.mCellIcon, cell.mCellTitle, cell.mCellExtra);'. Если он будет показывать значения nil - вы забудете связать элементы GUI с IBOtlet. – Avt

ответ

0

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

Я хотел бы просто суммировать несколько вещей, которые я позаботился, чтобы не пропустить в определении и использовании пера ячейки:

  • В СИБЕ, установите контроллер представления таблицы в качестве владельца файла
  • В NIB установите идентификатор ячейки для правильного значения (objListCell, для меня)
  • В NIB подключите каждый элемент пользовательского интерфейса к IBOutlet в файле .hh ячейки.
  • В ячейке.м-файл, возможно, синтезируют выходы, но если вы этого не сделаете, он работает все тот же
  • В viewWillAppear файла .m таблицы, зарегистрировать СИБ (подробности ниже)
  • В cellForRowAtIndexPath из .m стола файл, Dequeue вашей ячейки (подробности ниже)

Регистрация перо:

UINib* cellNib = [UINib nibWithNibName:@"ObjListCell" bundle:nil]; 
[self.tableView registerNib:cellNib forCellReuseIdentifier:@"objListCell"]; 

клетки освобождении пакета из очереди:

static NSString *cellIdentifier = @"objListCell"; 
ObjListCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

Все остальное как обычно.

2

Я бы предложил разместить [self.tableView reloadData] в viewWillAppear: поскольку tableView может быть недоступен еще в viewDidload :.

Кроме того, если у меня возникают проблемы, как это, я дам свои объекты границы, чтобы увидеть, если они на самом деле находится там, где я ожидаю, что они будут:

label.layer.borderWidth = 1.0f; 
label.layer.borderColor = [UIColor greenColor].CGColor; 

Как о попытке следующее cellForRowAtIndexPath:

static NSString *CellIdentifier = @"objTableCell"; 

ObjListCell *cell = (ObjListCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (!cell) 
{ 
    cell = [[DDTripCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 
+0

Спасибо, Ник, я переместил [self.tableView reloadData] в viewWillAppear, но это не решило проблему. Я также добавил окраску границ, как было предложено, но ничего не появляется. Кроме того, в раскадровке я устанавливал теги для Content View, значок и две метки. Затем попытался найти соответствующие представления с помощью viewWithTag, но получил нуль. Похоже, что прототип ячейки, определенный в раскадровке, вообще не работает ... И, наконец, если я переопределяю initWithStyle: reuseIdentifier в классе ObjListCell и помещаю в него NSLog, я вижу, что он вызывается. –

+0

Не могли бы вы вставить свой cellForRowAtIndexPath :, который может помочь в выявлении проблемы? – Nick

+0

Отредактированный исходный вопрос, чтобы добавить эти данные. mObjs - массив, содержащий данные для отображения в списке; он уже загружается при создании контроллера табличного представления. mIcons - это контейнер, в котором содержатся значки. Первоначально он содержит значки по умолчанию; фактические значки загружаются впоследствии, но это еще одна история ... –

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