UICollectionViewController неправильно загружается из NIB

iOS 6.0, тестирование на iPhone 5

Я загружаю подкласс UICollectionViewController из пера. Когда я запускаю метод awakeFromNib, он утверждает, что представление загружено. Вызов collectionView возвращает nil.

Поэтому у меня возникла проблема с регистрацией пера, из которого нужно загружать мои ячейки.

- (void)awakeFromNib {
  if ([self isViewLoaded])
    NSLog(@"[%@ %@] registered with %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd),
          self.collectionView);

  UINib *nib = [UINib nibWithNibName:@"MyCollectionCell" bundle:nil];
  [self.collectionView registerNib:nib forCellWithReuseIdentifier:NIB_ID];
}

Вывод сверху:

2012-09-22 19:21:49.129 myApp[7182:907] [MyCollectionViewController awakeFromNib] registered with (null)

Также не вызываются loadView и viewDidLoad (ожидается при загрузке из ниба).

Я терплю неудачу при попытке загрузить ячейки.

Текущий обходной путь, избыточная регистрация nib в collectionView:cellForItemAtIndexPath::

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
  UINib *nib = [UINib nibWithNibName:@"MyCollectionCell" bundle:nil];
  [collectionView registerNib:nib forCellWithReuseIdentifier:NIB_ID];

Вопросы. Вы сталкивались с этим? Видишь ли ты ошибочность моих путей? Это известная ошибка?


Изменить: дополнительная информация…

взломав awakeFromNib, collectionView кажется недоступным

(lldb) po [self view]
(UIView *) $1 = 0x1f158400 <UICollectionView: 0x1f158400; frame = (0 0; 320 548); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x1ed8fcf0>; layer = <CALayer: 0x1ed8f790>; contentOffset: {0, 0}> collection view layout: <UICollectionViewFlowLayout: 0x1ed919a0>
(lldb) po [self collectionView]
(UICollectionView *) $2 = 0x00000000 <nil>

изменение wakeFromNib для использования view вместо collectionView является лучшим обходным путем:

  [(UICollectionView *)self.view registerNib:nib forCellWithReuseIdentifier:NIB_ID];

person bshirley    schedule 23.09.2012    source источник
comment
У меня была аналогичная проблема. В итоге я решил проблему с регистрацией xib и класса в viewDidLoad. Вы регистрируете класс, а также перо? Я должен был зарегистрировать оба? [self.collectionView registerClass:[MyPhotoCell class] forCellWithReuseIdentifier:@"rPhotoCell"]; [self.collectionView registerNib:[UINib nibWithNibName:@"MyPhotoCell" bundle:nil] forCellWithReuseIdentifier:@"rPhotoCell"];   -  person propstm    schedule 11.10.2012
comment
@bshirley Я использовал трюк (UICollectionView *)self.view. Спасибо.   -  person Cœur    schedule 07.08.2013
comment
Вы не вызвали super awakeFromNib. Также вы должны выполнить настройку контроллера, поскольку он загружается. Если view действительно загрузил не вызывается, вам нужно посмотреть на причину этого.   -  person datinc    schedule 13.02.2014
comment
Вы когда-нибудь решали эту проблему?   -  person Tim Arnold    schedule 09.05.2014
comment
С тех пор я спал и не помню, в каком проекте он был. Я думаю, что мог отложить этот код до метода viewWillAppear:.   -  person bshirley    schedule 20.05.2014


Ответы (1)


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

Когда вы используете «self.view», метод доступа базового класса UIViewController для свойства «view» загрузит представление, если оно не было загружено. (Затем будет вызван ваш viewDidLoad.)

Если вы предоставите метод viewDidLoad для вашего viewController, вы можете зарегистрировать там свой UINib.

person Walt Sellers    schedule 20.02.2014