2014-01-28 2 views
6

Просто начните с UICollectionView. Я использовал IB для создания простого UICollectionView в UIViewController. Он прокручивается горизонтально под пейджинг. Я разместил простой UICollectionViewCell внутри UICollectionView. Я установил идентификатор повторного использования для ячейки.viewWithTag возвращает ноль при инициализации UICollectionViewCell

Я разместил UILabel с меткой 100 внутри UICollectionViewCell.

В viewDidLoad, я называю:

[_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Thing"]; 

Позже я пытаюсь инициализировать ячейки следующим образом:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Thing" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor greenColor]; 

    UILabel *nameLabel = (UILabel *)[cell viewWithTag:100]; 
    nameLabel.text = @"Bogus"; 

    return cell; 
} 

Когда я запустить приложение, вид нагрузок правильно; Я могу прокручивать по горизонтали через 2 ячейки. Я вижу уродливый зеленый цвет, идентифицирующий каждую ячейку.

Однако метод viewWithTag возвращает nil, и поэтому текст nameLabel не задан.

Почему?

Обратите внимание, что я также попытался определить пользовательский подкласс UICollectionViewCell и вызвать с ним registerClass. В IB я меняю класс ячеек на пользовательский подкласс, и я связываю UILabel с выходом UILabel в подклассе.

Но это также не работает. (Я бы предпочел избегать подкласса подкласса в любом случае, потому что нет необходимости определять классы только для того, чтобы удерживать IBOutlets.)

Я думаю, что мне не хватает чего-то очевидного здесь.

Аналогичная проблема описана здесь:

Trouble accessing Image from instance of UICollectionViewCell

+0

Где вы создаете UILabel? – Odrakir

+0

UILabel настроен в Interface Builder. Я не собираюсь выделять его в коде. Я думал, что viewWithTag должен получить созданный экземпляр. Вот как это работает с UITableView. – Daniel

+0

Вы назначили reuseIdentifier для прототипа CollectionViewCell в своем nib? – chandu

ответ

26

Удалить регистрационную строку. Вы делаете это на раскадровке, так что вам это не нужно.

+0

Это работает для меня. –

+0

Зачем им делать поведение по умолчанию, чтобы запутать sh * t разработчиков? Не большинство людей используют раскадровку ??? –

1

попробовать

UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:100];

Обновление:

Вы можете посмотреть иерархию ячейки и все его подвид в тег: [self showAllSubView:cell] ;, может вы найдете свой ярлык с тегом 10?

- (void)showAllSubView:(UIView *)view 
{ 
    for (UIView * subView in [view subviews]) { 
     NSLog(@"%@, tag:%d", subView, subView.tag) ; 
     [self showAllSubView:subView] ; 
    } 
} 
+1

Пробовал тоже - не работал.Попробовал снова за ногами - все равно не повезло – Daniel

+0

@ Даниэль Я обновил свой ответ, это может помочь найти, находится ли метка в иерархии ячейки. – KudoCC

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