web-dev-qa-db-ja.com

UICollectionView cellForItemAtIndexPathが呼び出されていません

UICollectionViewを使用するのは2回目であり、おそらく噛むことができる以上に噛み付いています。

サブクラス化したカスタムUICollectionViewCellを使用するUICollectionView(myCollectionView)を実装しています。サブクラス化されたセル(FullReceiptCell)はUITableViewを含み、ViewControllerのサイズです。 FullReceiptCells間の水平スクロールを許可しようとしています。

MyCollectionViewを含むサブクラス化されたUICollectionViewControllerは、navコントローラースタックにプッシュされています。現在、myCollectionView loasと水平スクロールが有効になっています。ただし、セルは表示されません。私はそれを確認しました

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

また、myCollectionViewのデリゲートとデータソースがIBでサブクラス化されたUICollectionViewControllerに適切に設定されていることも確認しました。

セルをロードする方法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

呼び出されていません。

ここで、そのコントローラー内でUICollectionViewControllerとviewDidLoadメソッドをプッシュします(注:initWithBillは通常のイニシャライザーのオーバーライドです)。

前のViewControllers .mファイルで:

FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];

FullReceiptViewController.m内:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
    self.myCollectionView.pagingEnabled = YES;
    // Setup flowlayout

    self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
    [self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    [self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
    self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
    [self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
    //testing to see if the collection view is loading
    self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];

なぜ呼び出されないのかについての手がかりはありますか?

91
IkegawaTaro

後でここでつまずく人のために....理由:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

collectionViewFlowLayoutのitemSizeが高すぎるために呼び出されていませんでした。

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];

高さを410に変更すると、cellForItemAtIndexPathが実行されます。

122
IkegawaTaro

私の場合、レイアウトクラスが UICollectionViewLayout ではなく UICollectionViewFlowLayout から誤ってサブクラス化されたためでした

81
esilver

コンテンツサイズ情報をコレクションビューに提供しない場合、cellForItemAtIndexPathは呼び出されません。

  1. フローレイアウトを使用している場合:アイテムのサイズを適切に設定する必要があります。
  2. ICollectionViewLayoutからサブクラス化されたカスタムレイアウトがある場合:collectionViewContentSizeメソッドから適切なサイズを返していることを確認します。

後者の場合、layoutAttributesForElementsRectも呼び出されないこともわかります。その理由は、コンテンツのサイズを指定していないため、デフォルトではサイズがCGSizeZeroになります。これは基本的に、ペイントするコンテンツがないことをコレクションビューに伝えるので、属性やセルを要求することはありません。

したがって、collectionViewContentSizeをオーバーライドして、適切なサイズを指定するだけで、問題が解決するはずです。

24
Deepak G M

たぶん見落としているだけかもしれませんが、デリゲートとデータソースが見つからないようです。ヘッダーファイルで、これらが追加されていることを確認します。

<UICollectionViewDelegate, UICollectionViewDataSource>

そして、あなたのviewDidLoadメソッドでこれを追加します:

self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;

また、.x​​ibを介してロードする場合は、IBOutletがUICollectionViewに接続されていることを確認してください。

15

より複雑なビュー階層については、これを確認してください blog 。それは私の命を救った!

self.automaticallyAdjustsScrollViewInsets = NO;
14
Jaybo

クラスがUICollectionviewControllerのサブクラスであり、collectionViewをプログラムで作成している場合は、

let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .Vertical
    layout.itemSize = CGSizeMake(50, 50)

    collectionView?.setCollectionViewLayout(layout, animated: false)
12
GSK

私は自動レイアウトを使用していましたが、私の場合は高さの制約がありませんでした

7
AamirR

私の場合、私が非常に愚かに忘れていたのは、UICollectionViewDataSourceプロトコルメソッドnumberOfItemsInSectionを実装することでした。

4
Dean

私の問題は、同じビュー内に2つのコレクションビューがあり、両方が計算されたUICollectionViewFlowLayoutインスタンスを共有していたことです。同じフローレイアウトの個別のインスタンスを作成すると、正常に機能しました。

4
nebyark

Xcode 7.0.1では、ストーリーボードと付随するコードを別のプロジェクトからコピーしたときにこの問題が発生しました。コレクションビューには、ストーリーボードにカスタムフローレイアウトが設定されていました。解決策は次のとおりです。

  • IBのフローレイアウトを削除する
  • アプリをコンパイル/実行する
  • フローレイアウトを元に戻す

今ではうまくいきました:)

3
Bart van Kuik

私の場合、UINavigationBarの半透明をNOに変更すると問題は解決しました。

3
chanil

CellForItemメソッドが呼び出されることを修正することにより、アイテムの高さ== 0のときにそれが起こっていました。

3
Jirune

10分前にこの問題に遭遇しましたが、愚かな間違いを犯しました。

私の意図は、UICollectionViewFlowLayoutを使用することです。

しかし、ミスのため、UICollectionViewLayoutを使用しました。

3
Vincent

numberOfSectionsInCollectionViewも正の整数を返すようにしてください。

コレクションには少なくとも1つのセクションが必要です。

2
Eran Goldin

コレクションビューで自動サイズ変更マスクをfalseに設定するのを忘れていました。

collectionView.translatesAutoresizingMaskIntoConstraints = false
2
Stritt

関連するレイアウトの問題である可能性があります。存在する場合は、コンソールからレイアウトの警告を確認してください。

2
erdikanik

私の場合、間違った自動レイアウト制約のために、親ビューでコレクションビューが完全に表示されませんでした。そのため、制約を修正するとコレクションビューがすべて表示され、cellForItemAtIndexPathが呼び出されました。

2
Khaled Annajar

-(NSInteger)collectionView:numberOfItemsInSection:が正の値(読み取り、ゼロより大きい)を返していることを確認してください。 [self.collectionView reloadData]を配置することが問題になる場合があります。完了ハンドラー。

2
RT Denver

コレクションビュープロトコルを使用している場合は、CollectionViewDataSourceおよびCollectionViewDataSourceプロトコルをViewControllerに接続する必要があります。 Interface builder outlets

2
Declan McKenna

Storyboard/xib UICollectionViewプロパティのcellSizeは{0、0}であってはなりません

2
poGUIst

私にも同じことが起こりました。 2つのUICollectionViewがありましたが、必要ないので一度削除しました。その後、CellForItemAtIndexPathが呼び出されるのではなく、他の必要なメソッドが呼び出されることに気付きました。上記のすべてを試しましたが、標準の魔法をかけました。ストーリーボードからコレクションビューを削除し、再度追加しました。その後、動作し始めました。理由はわかりませんが、説明はありませんが、おそらく接続の問題があります。

1
Hafeez

私の場合、collectionView.prefetchingEnabled = NO;を設定して問題を解決しました。 iOS 10でのみ動作します。

1
6david9

また、アニメーションでコレクションビューを更新している間(挿入、削除、更新、またはperformBatchUpdates)にreloadDataが呼び出されないようにしてください。

1
sasha_nec

UICollectionViewDelegateFlowLayoutを使用する場合、この関数が返すものに注意してください。 widthheightの両方は、0より大きくなければなりません。 windowをフレーム参照として使用しましたが、ビュー階層ウィンドウが複雑だったため、実行時にnilでした。画面の幅に基づいて要素の幅を調整する必要がある場合は、UIScreen.main.boundsを使用します。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
           UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}
1
inokey

私にとっては、autolayoutを介してself.view(collectionViewのスーパービュー)の高さを更新し、その後layoutIfNeededを呼び出す必要があります。

[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];
0
iwill

やや特定の状況で、この問題を解決しました。

私の場合、親ViewControllerでUICollectionViewControllerを手動で初期化し、UICollectionViewControllerのビューをサブビューとして追加していました。

親のviewDidAppearのcollectionViewで 'setNeedsLayout'および/または 'setNeedsDisplay'を呼び出すことで問題を解決しました。

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   [_collection.view setNeedsLayout];
   [_collection.view setNeedsDisplay];
}
0
Tim