Erst mein zweites Mal mit UICollectionView und vielleicht habe ich mehr abgebissen, als ich kauen kann, aber trotzdem:
Ich implementiere eine UICollectionView (myCollectionView), die benutzerdefinierte UICollectionViewCell verwendet, die ich in Unterklassen unterteilt habe. Die untergeordneten Zellen (FullReceiptCell) enthalten UITableViews und haben die Größe des Viewcontrollers. Ich versuche, ein horizontales Scrollen zwischen den FullReceiptCells zu ermöglichen.
Der untergeordnete UICollectionViewController, der myCollectionView enthält, wird auf einen Nav-Controller-Stack übertragen. Derzeit ist myCollectionView loas und horizontales Scrollen aktiviert. Es sind jedoch keine Zellen sichtbar. Ich habe das bestätigt
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
wurde ausgeführt und gibt eine Ganzzahl größer als 0 zurück. Ich habe außerdem bestätigt, dass der Delegat und die Datenquelle von myCollectionView in IB ordnungsgemäß auf den untergeordneten UICollectionViewController festgelegt sind.
Die Methode, mit der die Zellen geladen werden sollen:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
wird nicht aufgerufen.
Hier drücke ich den UICollectionViewController und meine viewDidLoad-Methode in diesen Controller (HINWEIS: initWithBill ist eine Überschreibung des normalen Initialisierers):
In der vorherigen ViewControllers .m-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];
Gibt es einen Hinweis darauf, warum es nicht aufgerufen wird?
quelle
Antworten:
Für diejenigen, die später hier stolpern .... der Grund:
wurde nicht aufgerufen, weil die itemSize für die collectionViewFlowLayout-Höhe zu groß war.
Wenn ich die Höhe auf 410 ändere, wird cellForItemAtIndexPath ausgeführt.
quelle
Adjust Scroll View Insets
Ihr ViewController im Storyboard.In meinem Fall lag es daran, dass meine Layoutklasse fälschlicherweise von
UICollectionViewLayout
statt klassifiziert wurdeUICollectionViewFlowLayout
quelle
Der cellForItemAtIndexPath wird nicht aufgerufen, wenn Sie der Sammlungsansicht keine Informationen zur Inhaltsgröße bereitstellen.
In letzterem Fall werden Sie auch feststellen , dass Ihr layoutAttributesForElementsRect ebenfalls nicht aufgerufen wird. Der Grund dafür ist, dass Sie nicht angegeben haben, wie groß Ihr Inhalt ist, und dass die Größe standardmäßig CGSizeZero ist. Dies teilt der Sammlungsansicht im Grunde mit, dass Sie keinen Inhalt zum Malen haben, sodass Sie nicht nach Attributen oder Zellen gefragt werden müssen.
Überschreiben Sie also einfach collectionViewContentSize und geben Sie dort die richtige Größe an. Dies sollte Ihr Problem lösen.
quelle
collectionViewContentSize
falsch 0 für die Breite zurückgegeben, deshalbcellForItemAtIndexPath
wurde die nicht aufgerufen.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 Folgendes hinzugefügt haben:
Fügen Sie in Ihrer viewDidLoad-Methode Folgendes hinzu:
Wenn Sie es über eine .xib laden, stellen Sie außerdem sicher, dass Sie das IBOutlet mit der UICollectionView verbunden haben.
quelle
Für eine kompliziertere Ansichtshierarchie überprüfen Sie bitte diesen Blog . Es hat mein Leben gerettet!
quelle
Wenn Ihre Klasse eine Unterklasse von UICollectionviewController ist und Sie collectionView programmgesteuert erstellen, verwenden Sie
quelle
Ich habe Autolayout verwendet und in meinem Fall fehlte die Höhenbeschränkung
quelle
Mein Problem war, dass ich zwei Sammlungsansichten in derselben Ansicht hatte und beide eine berechnete
UICollectionViewFlowLayout
Instanz gemeinsam nutzten . Nachdem ich separate Instanzen desselben Ablauflayouts erstellt hatte, funktionierte dies einwandfrei.quelle
In meinem Fall hatte ich sehr dumm vergessen, die
UICollectionViewDataSource
Protokollmethode zu implementierennumberOfItemsInSection
, also ist das eine andere Sache, die überprüft werden muss.quelle
Stellen Sie außerdem sicher, dass reloadData nicht aufgerufen wird, während die Sammlungsansicht mit Animation aktualisiert wird (Einfügen, Löschen, Aktualisieren oder Durchführen von BatchUpdates).
quelle
In meinem Fall hat set
collectionView.prefetchingEnabled = NO;
mein Problem gelöst. Funktioniert nur unter iOS 10.quelle
Es passierte für mich, als die Elementhöhe == 0 war, indem die cellForItem-Methode aufgerufen wurde.
quelle
Vor zehn Minuten bin ich auch auf dieses Problem gestoßen, ich habe einen dummen Fehler gemacht.
Meine Absicht ist es, UICollectionViewFlowLayout zu verwenden.
Aber wegen Fehlern habe ich UICollectionViewLayout verwendet.
quelle
In meinem Fall wurde das Problem durch Ändern der durchscheinenden UINavigationBar in NO gelöst.
quelle
In Xcode 7.0.1 trat dieses Problem auf, als wir ein Storyboard und den zugehörigen Code aus einem anderen Projekt kopierten. In der Sammlungsansicht wurde im Storyboard ein benutzerdefiniertes Ablauflayout festgelegt. Die Lösung war:
Jetzt hat es funktioniert :)
quelle
Stellen Sie sicher, dass auch
numberOfSectionsInCollectionView
eine positive Ganzzahl zurückgegeben wird.Es muss mindestens einen Abschnitt in der Sammlung geben.
quelle
Stellen Sie sicher, dass - (NSInteger) collectionView: numberOfItemsInSection: einen positiven Wert (read, größer als Null) zurückgibt. Möglicherweise müssen Sie [self.collectionView reloadData] platzieren. im Completion Handler.
quelle
Ich habe vergessen, die Autoresizing-Maske in der Sammlungsansicht auf false zu setzen:
quelle
Es können Layoutprobleme realisiert werden. Überprüfen Sie die Layoutwarnungen von der Konsole, falls vorhanden.
quelle
In meinem Fall war die Sammlungsansicht in der übergeordneten Ansicht aufgrund falscher Einschränkungen für das automatische Layout nicht vollständig sichtbar. Durch das Korrigieren der Einschränkungen wurde die Sammlungsansicht sichtbar und cellForItemAtIndexPath wurde aufgerufen.
quelle
In der Storyboard / xib-UICollectionView-Eigenschaft darf cellSize nicht {0, 0} sein.
quelle
Wenn Sie Protokolle für die Sammlungsansicht verwenden, müssen Sie die Protokolle
CollectionViewDataSource
undCollectionViewDelegate
mit Ihrem ViewController verbinden.quelle
Das gleiche ist mir passiert. Ich hatte 2 UICollectionViews und habe sie einmal entfernt, da ich das nicht brauchte. Danach wurde mir klar, dass der CellForItemAtIndexPath nicht aufgerufen wurde, sondern die anderen erforderlichen Methoden. Ich habe all das versucht, aber dann habe ich die Standardmagie gemacht. Die Sammlungsansicht wurde aus dem Storyboard entfernt und erneut hinzugefügt. Dann fing es an zu arbeiten. Ich weiß nicht warum und ich habe keine Erklärung, aber vielleicht einige Verbindungsprobleme.
quelle
Dieses Problem wurde gerade für eine bestimmte Situation behoben.
In meinem Fall habe ich den UICollectionViewController in einem übergeordneten ViewController manuell initialisiert und dann die Ansicht des UICollectionViewController als Unteransicht hinzugefügt.
Ich habe das Problem behoben, indem ich 'setNeedsLayout' und / oder 'setNeedsDisplay' in der collectionView in der viewDidAppear des Elternteils aufgerufen habe:
quelle
Achten Sie bei der Verwendung
UICollectionViewDelegateFlowLayout
darauf, was diese Funktion zurückgibt. Beideswidth
undheight
sollte größer sein als0
. Ich habewindow
als Rahmenreferenz verwendet, aber aufgrund der komplizierten Ansichtshierarchie war das Fensternil
zur Laufzeit. Wenn Sie die Breite des Elements basierend auf der Bildschirmbreite anpassen müssen, verwenden SieUIScreen.main.bounds
.quelle
Für mich aktualisiere ich die Höhe von self.view (die Übersicht von collectionView) über Autolayout und MUSS danach aufrufen
layoutIfNeeded
.quelle
In meinem Fall musste ich die geschätzte Inhaltsgröße anpassen. Inhaltsgröße hat es nicht getan.
quelle
Ich hatte ein ähnliches Problem. Aber stattdessen
cellForItemAtIndexPath
wurde aufgerufen, wenn die Anzahl der Elemente> 1 war, aber nicht, wenn es nur ein einzelnes Element gab. Ich habe viele der hier vorgeschlagenen Lösungen ausprobiert und ähnlich wie bei vielen anderen festgestellt, dass dies mit der Größe der Artikel zu tun hat. Für mich bestand die Lösung darin, die geschätzte Größe vonUICollectionView
von Automatisch auf Benutzerdefiniert zu ändern .quelle
In meinem Fall hatte ich das
collectionView
in einemUIStackView
mitalignment = .center
. DascollectionView
hatte also keine Breite. Wenn die EinstellungstackView.alignment
auf.fill
alles war in Ordnung.quelle
Ich habe ein wenig Zeit damit verbracht, dass dieses Problem mit einer CollectionView in einem Contained View-Controller auftritt, der aus einem Storyboard geladen wurde. Am Ende habe ich nur den enthaltenen View Controller gelöscht und im Storyboard neu erstellt, und dies schien das Problem zu beseitigen. Ich vermute, es gab eine Art Storyboard-Korruption, die stattgefunden hatte.
quelle