ios - UICollectionViewController 未从 NIB 有效加载

标签 ios ios6 uicollectionview

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 。这是为了限制没有放在屏幕上的东西的内存消耗。

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

如果您为您的 viewController 提供了一个 viewDidLoad 方法,您可以在那里注册您的 UINib。

关于ios - UICollectionViewController 未从 NIB 有效加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12548816/

相关文章:

ios - iOS更改受UIVibrancyEffect影响的标签颜色

ios - didUpdateHeading 未调用

iphone - Flash cs5 中的 plist.info

function - 使用 Logos (%hook) 从另一个类调用函数

ios - 无法从天气 api 获取 json。 iOS系统

objective-c - UICollectionView:如何定义支持水平和垂直滚动的 UICollectionViewLayout?

xcode - 在 iOS 5.1 设备上运行的程序找不到带有 Xcode 4.5 的 SDK

ios - 更改 CollectionView 单元格的垂直间距

ios - 持久化 Collection View 单元格选择

ios - iOS 上的 sendSubviewToBack 不起作用