iOS 6.0,在iPhone 5上进行测试

我正在从 Nib 加载UICollectionViewController的子类。
当我加热awakeFromNib方法时,它声称已加载 View 。
调用collectionView返回nil

因此,我在注册从中加载我的单元的 Nib 时遇到问题。

- (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)

同样,不调用loadViewviewDidLoad(从 Nib 加载时预期)。

尝试加载单元格时出现异常,我失败了。

当前的解决方法,在collectionView:cellForItemAtIndexPath:中冗余注册 Nib :
- (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];

最佳答案

从 Nib 加载 View Controller 并不旨在加载 View 。 iOS延迟加载方案仅在尝试访问 View 时才加载 View 。这是为了限制未放在屏幕上的东西的内存消耗。

当您使用“self.view”时,“view”属性的UIViewController基类访问器将加载该 View (如果尚未加载)。 (然后将调用您的viewDidLoad。)

如果为viewController提供viewDidLoad方法,则可以在其中注册UINib。

10-06 04:33
查看更多