116

UICollectionViewを使用したのは2回目で、噛むことができる以上に噛んだかもしれませんが、それでも次のようになります。

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

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

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

が実行され、0より大きい整数が返されます。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];

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

4

33 に答える 33

146

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

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

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

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

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

于 2013-02-04T07:17:14.040 に答える
106

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

于 2014-08-20T22:32:22.863 に答える
35

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

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

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

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

于 2014-07-22T09:59:22.597 に答える
18

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

self.automaticallyAdjustsScrollViewInsets = NO;
于 2016-01-08T08:34:59.010 に答える
16

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

<UICollectionViewDelegate, UICollectionViewDataSource>

そして、viewDidLoadメソッドにこれを追加します。

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

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

于 2013-02-03T02:20:11.517 に答える
15

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

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

    collectionView?.setCollectionViewLayout(layout, animated: false)
于 2017-01-30T14:56:23.770 に答える
10

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

于 2017-11-27T11:20:13.070 に答える
6

私の場合、非常に愚かなことを忘れていたのは、UICollectionViewDataSourceプロトコルメソッドを実装することだっnumberOfItemsInSectionたので、それは別のチェック事項です。

于 2014-02-05T07:41:54.173 に答える
6

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

于 2017-09-07T17:52:24.850 に答える
5

10分前にもこの問題に遭遇しました。ばかげた間違いをしました。

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

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

于 2015-04-18T08:01:49.107 に答える
5

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

于 2017-05-17T00:30:34.423 に答える
4

私の場合、セットcollectionView.prefetchingEnabled = NO;は私の問題を解決しました。iOS10でのみ動作します。

于 2017-05-19T02:25:53.047 に答える
4

私も同様の問題を抱えていました。ただしcellForItemAtIndexPath、アイテムの数が1を超える場合は呼び出されましたが、アイテムが1つしかない場合は呼び出されませんでした。私はここで提案された解決策の多くを試しましたが、それがアイテムのサイズ設定に関係していることがわかった多くの解決策と同様です。私にとっての解決策は、の見積もりサイズを自動からカスタムに変更UICollectionViewすることでし

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

于 2020-04-18T06:42:15.323 に答える
4

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

于 2020-05-04T16:01:34.410 に答える
3

cellForItemメソッドが呼び出されたことを修正して、アイテムの高さ==0のときに発生していました。

于 2013-11-20T13:36:09.417 に答える
3

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

于 2015-09-02T08:03:42.690 に答える
3

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

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

今それは働いた:)

于 2015-10-29T07:15:19.157 に答える
3

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

collectionView.translatesAutoresizingMaskIntoConstraints = false
于 2016-03-02T18:58:20.960 に答える
3

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

于 2018-10-10T14:43:47.450 に答える
2

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

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

于 2015-01-13T18:51:21.077 に答える
2

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

于 2015-01-30T21:48:35.790 に答える
2

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

于 2017-03-28T11:40:57.677 に答える
2

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

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
           UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}
于 2017-10-19T09:50:13.083 に答える
2

レイアウトの問題が発生する可能性があります。存在する場合は、コンソールからレイアウト警告を確認します。

于 2017-11-01T09:52:14.020 に答える
2

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

于 2017-12-06T10:21:18.360 に答える
1

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

于 2014-11-01T03:35:58.173 に答える
1

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

[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];
于 2017-06-13T13:42:39.607 に答える
1

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

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

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

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   [_collection.view setNeedsLayout];
   [_collection.view setNeedsDisplay];
}
于 2017-07-16T00:34:49.463 に答える
0

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

  let layout = collectionVC.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: 100, height: 100)
    layout.estimatedItemSize = CGSize(width: 100, height: 100)
于 2019-12-19T09:22:04.807 に答える
0

私の場合、これによる回避策を見つけました:

  //IF RELOAD COLLECTION VIEW AFTER DELAY IT WORKS
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
        //ASSIGN NEW DATA SOURCE
        self.arrItem = arrModel
        self.collectionView.reloadData()
    }
于 2021-06-10T08:19:38.867 に答える
0

i)UICollectionViewをsubViewとしてではなく、UITableViewCellscontentViewに追加しください

于 2021-12-22T22:58:16.423 に答える
-1

ストーリーボードからロードされたContainedViewControllerのCollectionViewでこの問題が発生するので、少し時間がかかりました。含まれているViewControllerを削除してストーリーボードに再作成するだけで、問題が解決したようです。私の推測では、ある種のストーリーボードの破損が発生したと思います。

于 2016-01-20T00:34:51.287 に答える
-2

カスタムセルのlayoutSubViews()内にcollectionViewフレームを設定すると、次のように機能しました。

override func layoutSubviews() {
        super.layoutSubviews()
        let frame = self.contentView.bounds
        self.CollectionView.frame = frame
    }
于 2015-12-25T11:42:47.487 に答える