6

iOS 6.0、iPhone 5 でのテスト

UICollectionViewControllernib からのサブクラスをロードしています。メソッドをホットする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)

また、loadViewandviewDidLoadは呼び出されません (ペン先からロードする場合に期待されます)。

セルをロードしようとすると、例外で失敗します。

現在の回避策、重複して nib を登録するcollectionView:cellForItemAtIndexPath::

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

質問:これに出くわしたことがありますか? 私のやり方の間違いがわかりますか?これは既知のバグですか?


編集: 追加情報 …</p>

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に使用するように変更することは、より良い回避策です。viewcollectionView

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

1 に答える 1

3

nib からビュー コントローラーをロードすることは、ビューをロードするためのものではありません。iOS の遅延読み込みスキームは、何かがアクセスを試みた場合にのみビューを読み込みます。これは、画面に表示されていないもののメモリ消費を制限することを目的としています。

「self.view」を使用する場合、「view」プロパティの UIViewController 基本クラス アクセサーは、ビューがまだ読み込まれていない場合に読み込みます。(その後、viewDidLoad が呼び出されます。)

viewController に viewDidLoad メソッドを提供すると、そこに UINib を登録できます。

于 2014-02-20T11:21:28.963 に答える