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


104

UICollectionViewを使用するのは2回目だけであり、おそらく私が噛むことができる量を超えて噛んでしまいましたが、

サブクラス化したカスタムUICollectionViewCellを使用するUICollectionView(myCollectionView)を実装しています。サブクラス化されたセル(FullReceiptCell)にはUITableViewが含まれており、ビューコントローラーのサイズです。FullReceiptCells間の水平スクロールを可能にしようとしています。

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

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

が実行され、0より大きい整数を返しています。また、myCollectionViewのデリゲートとデータソースがサブクラス化されたUICollectionViewControllerのIBで適切に設定されていることも確認しました。

セルをロードする方法:

- (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];

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


XIBを使用しています。呼び出されることがないため、cellForItemsAtIndexPathでデキューできません。
池川太郎2013

回答:


135

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

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

呼び出されていなかったのは、collectionViewFlowLayoutのitemSizeの高さが大きすぎたためです。

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

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


もう少し詳しく説明してください。同じことが私にも起こっています
user1010819

collectionViewContentSizeにも注意する必要があることを発見しました
Dimitar Marinov

49
自動レイアウトを使用している場合-必ずcollectionViewに高さの制約を設定してください-これに何時間も無駄にしてください!
bpn 2014

レコードの高さの制約が機能しなかったためです。水平方向の中心の制約でうまく
いきました

4
collectionViewがAutoLayoutでtopLayoutGuideに制限されており、NavigationBarの下でスクロールすることが想定されていないAdjust Scroll View Insets場合は、ストーリーボードのViewController をオフに してください。
Bruno Galinari 16

96

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


1
ありがとうございました。私は何年も過ごしました
Rambatino、2015年

これも私の問題でした!それは少し直観に反しているので、私には起こりませんでした。これをありがとう!
WendiKidd 2016

わたしも!見落としがちです!再度ありがとう
arvidurs

ここでFacepalm、これを指摘してくれてありがとう(4年前)。
ミランダー

私は同じ問題に直面していました。ありがとう
Piyush Gupta

31

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

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

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

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


1
たとえば、利用可能なフルサイズを使用するには、collectionViewContentSizeからcollectionView.frame.sizeを返します(デフォルトは0、0のcollectionView.contentSizeだけではありません)
Adam Loving

ありがとう!この回答は私に役立ちましたb / cカスタムUICollectionViewLayoutがあります。シミュレーターでアプリを横向きで起動した場合、一部のセルが初期ビューに表示されませんでした。コンテンツサイズを上書きすると、この問題が修正されました。
Chris Livdahl

1
ありがとうございました。私の場合、collectionViewContentSize幅に対して誤って0が返されたため、cellForItemAtIndexPathが呼び出されませんでした。
izerik 2018年

16

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

<UICollectionViewDelegate, UICollectionViewDataSource>

そしてあなたのviewDidLoadメソッドでこれを追加してください:

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

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


1
表示しませんでしたが、ヘッダーファイルには既にデリゲートとデータソースが記載されています。さらに、IBOutletをmyCollectionViewに配線しました。このcollectionviewのデリゲートとデータソースはFullReceiptViewControllerに設定されています。奇妙なことはnumberOfItemsInSection(データソースプロトコル法)と呼ばれ、0よりも大きい整数を返すなっていることである
IkegawaTaro

うーん、アプリケーションを起動すると、コレクションビューに何が表示されますか?numberOfItemsInSectionが0よりも何か大きなを返した場合、それはそれでいくつかのアイテムを持っていないようですね
アンソニー・カステッリ

フォローアップありがとうございます。コレクションビューは表示します...背景色を変更したのでわかります。私は問題を見つけたと思います:[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320、548)]; これは大きすぎました。高さを410に減らすと、cellForItemAtIndexPathメソッドを呼び出すことができます。
池川太郎2013

@AnthonyCastelliこんにちは、私も同じ問題に直面しています。numberOfItemsInSectionがポップでviewControllerに呼び出されますが、cellForItemsAtIndexPathでは呼び出されません。だからあなたは手がかりを得るのですか?
Bhavin Kansagara 2013年

16

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

self.automaticallyAdjustsScrollViewInsets = NO;

1
私はこれに多くの時間を費やしました-そしてそれはすべてそれに帰着しました。ストーリーボードまたはXIBを使用している場合は、親ビューコントローラーを確認し、デフォルトでオンになっている属性インスペクターの[スクロールビューインセットの調整]の選択を解除します。私は他のすべての答えを試してみましたが、うまくいきませんでした。これが原因です。
etayluz、2016年

15

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

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

    collectionView?.setCollectionViewLayout(layout, animated: false)

これが私の問題を解決した答えです!オーバーライドメソッドfunc collectionView(_ collectionView:UICollectionView、layout collectionViewLayout:UICollectionViewLayout、sizeForItemAt indexPath:IndexPath)-> CGSize {<#code#>}が機能しません。
マイク

8

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


6

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


5

私の場合、私が愚かに忘れていたのはUICollectionViewDataSourceプロトコルメソッドを実装することだったnumberOfItemsInSectionので、それを確認する必要があります。


4

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


4

私の場合、collectionView.prefetchingEnabled = NO;問題を解決したセットです。iOS 10でのみ機能します。


2
私は少し前にその回答に賛成しました、そして今日それは私を再び助けました:Dあなたはこの回答者のために貴族に値する。再度、感謝します!
Maciek Czarnik

この答えは私にとってうまくいきました!そもそもなぜそれが含まれていたのかについての説明があったらいいのに。
ランスサマリア

3

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


3

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

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

しかし、間違いのため、UICollectionViewLayoutを使用しました。


3

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


3

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

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

今それは働いた:)


2

numberOfSectionsInCollectionView正の整数も返されることを確認してください。

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


2

-(NSInteger)collectionView:numberOfItemsInSection:が正の(読み取り、ゼロより大きい)値を返していることを確認します。[self.collectionView reloadData]を配置するだけの問題かもしれません。完了ハンドラで。


2

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

collectionView.translatesAutoresizingMaskIntoConstraints = false

2

レイアウトの問題を実現することができます。存在する場合は、コンソールからのレイアウト警告を確認してください。


2

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


2

ストーリーボード/ xibのUICollectionViewプロパティのcellSizeは{0、0}であってはなりません


2

コレクションビュープロトコルを使用している場合は、CollectionViewDataSourceおよびCollectionViewDelegateプロトコルをViewControllerに接続する必要があります。 インターフェースビルダーアウトレット


1

同じことが私にも起こりました。私は2つのUICollectionViewsを持っていて、それを必要としなかったので一度削除しました。その後、CellForItemAtIndexPathが呼び出されず、他の必要なメソッドが呼び出されていることに気付きました。私は上記のすべてを試しましたが、それから標準的なマジックを行いました。ストーリーボードからコレクションビューを削除して、再度追加しました。それからそれは働き始めました。理由がわからないので説明はありませんが、接続の問題が発生している可能性があります。


UICollectionViewをストーリーボードの別のUIViewControllerからコピーしました。CollectionViewを削除し、再度追加して機能させました。お返事ありがとうございます。
Drunken Daddy

1

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

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

親のviewDidAppearのcollectionViewで「setNeedsLayout」や「setNeedsDisplay」を呼び出すことで問題を解決しました。

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

1

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

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

1

私の場合、私はwith を持っていcollectionViewました。したがって、幅はありませんでした。をすべてに設定すると問題ありませんでした。UIStackViewalignment = .centercollectionViewstackView.alignment.fill


0

私にとっては、autolayoutを介してself.view(collectionViewのスーパービュー)の高さを更新し、layoutIfNeededその後呼び出しなければなりません。

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

0

私の場合、推定コンテンツサイズを調整する必要がありました。コンテンツサイズはそれをしませんでした。

  let layout = collectionVC.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: 100, height: 100)
    layout.estimatedItemSize = CGSize(width: 100, height: 100)

0

私は同様の問題を抱えていました。しかし、代わりcellForItemAtIndexPathにアイテムの数が1を超えたときに呼び出されましたが、アイテムが1つだけの場合には呼び出されませんでした。私はここで提案された解決策の多くを試してみましたが、アイテムのサイジングに関係していることがわかった多くの解決策と似ています。私のためのソリューションは、の推定値の大きさを変更することでしたUICollectionViewから自動カスタム

見積もりサイズをカスタムに設定


-1

ストーリーボードから読み込まれたContainedビューコントローラのCollectionViewでこの問題が発生するので、少し時間を費やしました。結局、含まれているView Controllerを削除して、ストーリーボードで再作成しただけで、これで問題が解消されたようです。私の推測では、起こったある種のストーリーボードの破損がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.