Frage Der cellForItemAtIndexPath von UICollectionView wird nicht aufgerufen


Nur das zweite Mal benutze ich UICollectionView's und vielleicht habe ich mehr abgebissen als ich kauen kann aber trotzdem:

Ich implementiere eine UICollectionView (myCollectionView), die benutzerdefinierte UICollectionViewCells verwendet, die ich unterklassiert habe. Die untergeordneten Zellen (FullReceiptCell) enthalten UITableViews und haben die Größe des Viewcontrollers. Ich versuche, horizontales Scrollen zwischen den FullReceiptCells zu ermöglichen.

Der untergeordnete UICollectionViewController, der myCollectionView enthält, wird an einen Nav-Controller-Stack weitergeleitet. Momentan ist myCollectionView Loas und horizontales Scrollen aktiviert. Es sind jedoch keine Zellen sichtbar. Das habe ich bestätigt

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

hat ausgeführt und gibt eine Ganzzahl größer als 0 zurück. Ich habe auch bestätigt, dass der Delegat und die Datenquelle von MyCollectionView ordnungsgemäß in IB in dem Unterklasse UICollectionViewController festgelegt sind.

Die Methode, mit der die Zellen geladen werden sollen:

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

wird nicht angerufen.

Hier ist, wo ich die UICollectionViewController und meine ViewDidLoad-Methode innerhalb dieses Controllers (HINWEIS: InitWithBill ist eine Überschreibung des normalen Initializer):

In der früheren ViewControlers-Mm-Datei:

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

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

Irgendeine Ahnung, warum es nicht aufgerufen wird?


74
2018-02-03 02:06


Ursprung


Antworten:


Für die, die hier später stolpern .... der Grund:

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

wurde nicht aufgerufen, weil die itemSize für die Auflistung ViewFlowLayout die Höhe zu groß war.

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

Wenn ich die Höhe auf 410 ändere, wird cellForItemAtIndexPath ausgeführt.


100
2018-02-04 07:17



In meinem Fall lag das daran, dass meine Layoutklasse fälschlicherweise von der Unterklasse abgeleitet wurde UICollectionViewLayout Anstatt von UICollectionViewFlowLayout


64
2017-08-20 22:32



Der cellForItemAtIndexPath wird nicht aufgerufen, wenn Sie die Inhaltsgrößeninformationen nicht der Sammlungsansicht bereitstellen.

  1. Wenn Sie das Flow-Layout verwenden: Sie müssen die Artikelgrößen richtig einstellen.
  2. Wenn Sie ein benutzerdefiniertes Layout haben, das von UICollectionViewLayout abgeleitet wurde: Stellen Sie sicher, dass Sie eine korrekte Größe aus der collectionViewContentSize-Methode zurückgeben.

Im letzteren Fall werden Sie auch beobachten, dass Ihre layoutAttributesForElementsRect wird auch nicht genannt. Der Grund ist, dass Sie nicht angegeben haben, was Ihre Inhaltsgröße ist, und standardmäßig wird die Größe CGSizeZero sein. Dies teilt im Grunde die Sammlungsansicht mit, dass Sie keinen Inhalt zum Zeichnen haben, so dass Sie nicht nach Attributen oder Zellen fragen müssen.

Überschreiben Sie also einfach collectionViewContentSize und stellen Sie dort eine korrekte Größe bereit, damit Ihr Problem gelöst werden kann.


20
2017-07-22 09:59



Für eine kompliziertere Ansichtshierarchie überprüfen Sie dies bitte Blog. Es hat mein Leben gerettet!

self.automaticallyAdjustsScrollViewInsets = NO;

14
2018-01-08 08:34



Vielleicht übersehe ich es nur, aber es scheint, dass Sie Ihren Delegierten und Ihre Datenquelle vermissen. Stellen Sie in Ihrer Header-Datei sicher, dass Sie diese hinzugefügt haben:

<UICollectionViewDelegate, UICollectionViewDataSource>

und in deiner viewDidLoad Methode füge folgendes hinzu:

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

Stellen Sie außerdem sicher, dass Sie das IBOutlet mit dem UICollectionView verbunden haben, wenn Sie es über eine .xib laden.


13
2018-02-03 02:20



Was ich in meinem Fall sehr dumm vergessen hatte, war die Umsetzung der UICollectionViewDataSourceProtokollmethode numberOfItemsInSectionDas ist eine andere Sache, die zu überprüfen ist.


4
2018-02-05 07:41



Wenn Ihre Klasse eine Unterklasse von UICollectionviewController ist und Sie CollectionView programmgesteuert erstellen, verwenden Sie

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

    collectionView?.setCollectionViewLayout(layout, animated: false)

4
2018-01-30 14:56