Dopiero po raz drugi używam UICollectionView i być może odgryzłem więcej, niż jestem w stanie przeżuć, ale mimo to:
Implementuję UICollectionView (myCollectionView), który używa niestandardowych UICollectionViewCell, które mam podklasę. Komórki podklasy (FullReceiptCell) zawierają UITableView i mają rozmiar kontrolera widoku. Próbuję zezwolić na przewijanie w poziomie między FullReceiptCells.
Podklasa UICollectionViewController, która zawiera myCollectionView, jest wypychana do stosu kontrolera nawigacji. Obecnie Loas myCollectionView i przewijanie w poziomie są włączone. Jednak żadne komórki nie są widoczne. Potwierdziłem to
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
został uruchomiony i zwraca liczbę całkowitą większą niż 0. Potwierdziłem również, że delegat myCollectionView i źródło danych są prawidłowo ustawione w IB do podklasy UICollectionViewController.
Sposób ładowania komórek:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
nie jest wezwany.
Oto miejsce, w którym wypycham UICollectionViewController i moją metodę viewDidLoad w ramach tego kontrolera (UWAGA: initWithBill jest zastąpieniem normalnego inicjatora):
W poprzednim pliku ViewControllers .m:
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
W 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];
Jakieś wskazówki, dlaczego nie jest nazywany?
źródło
Odpowiedzi:
Dla tych, którzy potkną się tutaj później ... powód:
nie była wywoływana, ponieważ element itemSize dla kolekcji ViewFlowLayout był zbyt duży.
Jeśli zmienię wysokość na 410, to wykona cellForItemAtIndexPath.
źródło
Adjust Scroll View Insets
w swoim ViewController na Storyboard.W moim przypadku było to spowodowane nieprawidłową podklasą mojej klasy układu z
UICollectionViewLayout
zamiastUICollectionViewFlowLayout
źródło
Funkcja cellForItemAtIndexPath nie zostanie wywołana, jeśli nie podasz informacji o rozmiarze zawartości w widoku kolekcji.
W przypadku tego drugiego zauważysz również, że twój layoutAttributesForElementsRect również nie jest wywoływany. Powodem jest to, że nie określiłeś, jaki jest rozmiar twojej zawartości i domyślnie będzie to CGSizeZero. To w zasadzie mówi widokowi kolekcji, że nie masz żadnej treści do namalowania, więc nie kłopocze się pytaniem o atrybuty lub komórki.
Więc po prostu zastąp collectionViewContentSize i podaj tam odpowiedni rozmiar, to powinno rozwiązać twój problem.
źródło
collectionViewContentSize
niepoprawnie zwrócone 0 dla szerokości, dlategocellForItemAtIndexPath
nie został wywołany.Może po prostu to przeoczam, ale wygląda na to, że brakuje ci pełnomocnika i źródła danych. W pliku nagłówkowym upewnij się, że dodałeś te:
iw swojej metodzie viewDidLoad dodaj to:
Ponadto, jeśli ładujesz go za pomocą pliku .xib, upewnij się, że masz połączenie IBOutlet z UICollectionView.
źródło
Aby uzyskać bardziej skomplikowaną hierarchię widoku, sprawdź ten blog . To uratowało mi życie!
źródło
Jeśli Twoja klasa jest podklasą z UICollectionviewController i programowo tworzysz collectionView, użyj
źródło
Używałem autoukładu, aw moim przypadku brakowało ograniczenia wysokości
źródło
Mój problem polegał na tym, że miałem 2 widoki kolekcji w tym samym widoku i oba współdzieliły obliczoną
UICollectionViewFlowLayout
instancję. Po utworzeniu oddzielnych instancji tego samego układu przepływu wszystko działało dobrze.źródło
W moim przypadku to, o czym bardzo głupio zapomniałem, to zaimplementowanie
UICollectionViewDataSource
metody protokołunumberOfItemsInSection
, więc to kolejna rzecz do sprawdzenia.źródło
Upewnij się również, że reloadData nie jest wywoływana podczas aktualizowania widoku kolekcji za pomocą animacji (wstawianie, usuwanie, aktualizowanie lub wykonywanie BatchUpdates).
źródło
W moim przypadku zestaw
collectionView.prefetchingEnabled = NO;
rozwiązał mój problem. Działa tylko na iOS 10.źródło
Stało się to dla mnie, gdy wysokość elementu == 0 przez naprawienie wywołania metody cellForItem.
źródło
Dziesięć minut temu też napotkałem ten problem, popełniłem głupi błąd.
Moim zamiarem jest użycie UICollectionViewFlowLayout,
Ale z powodu błędów użyłem UICollectionViewLayout.
źródło
W moim przypadku zmiana półprzezroczystego paska UINavigationBar na NO rozwiązała problem.
źródło
W Xcode 7.0.1 napotkaliśmy ten problem, gdy skopiowaliśmy scenorys i towarzyszący mu kod z innego projektu. Widok kolekcji miał niestandardowy układ przepływu ustawiony w scenorysie. Rozwiązaniem było:
Teraz zadziałało :)
źródło
Upewnij się, że
numberOfSectionsInCollectionView
zwraca również dodatnią liczbę całkowitą.W kolekcji musi znajdować się co najmniej jedna sekcja.
źródło
Upewnij się, że - (NSInteger) collectionView: numberOfItemsInSection: zwraca wartość dodatnią (odczytaną, większą niż zero). Może to być kwestia umieszczenia [self.collectionView reloadData]; w programie obsługi zakończenia.
źródło
Zapomniałem ustawić maskę autorezyzacji na false w widoku kolekcji:
źródło
Mogą to być problemy z układem. Sprawdź ostrzeżenia dotyczące układu z konsoli, jeśli istnieją.
źródło
W moim przypadku widok kolekcji nie był w pełni widoczny w swoim widoku nadrzędnym z powodu nieprawidłowych ograniczeń automatycznego układu. Zatem naprawienie ograniczeń sprawiło, że widok kolekcji był widoczny i wywołano cellForItemAtIndexPath.
źródło
W storyboard / xib właściwość UICollectionView cellSize NIE MOŻE być {0, 0}
źródło
Jeśli używasz protokołów widoku kolekcji, musisz podłączyć protokoły
CollectionViewDataSource
iCollectionViewDelegate
do ViewController.źródło
To samo przytrafiło się mnie. Miałem 2 UICollectionViews i usunąłem raz, ponieważ tego nie potrzebowałem. Po tym zdałem sobie sprawę, że CellForItemAtIndexPath nie jest wywoływany, ale inne wymagane metody. Wypróbowałem wszystkie powyższe, ale potem wykonałem standardową magię. Usunięto widok kolekcji z serii ujęć i dodano ponownie. Potem zaczęło działać. Nie wiem dlaczego i nie mam wyjaśnienia, ale może pewne problemy z połączeniem.
źródło
Właśnie rozwiązałem ten problem w nieco konkretnej sytuacji.
W moim przypadku ręcznie inicjowałem UICollectionViewController w nadrzędnym ViewController, a następnie dodałem widok UICollectionViewController jako podwidok.
Rozwiązałem problem, wywołując „setNeedsLayout” i / lub „setNeedsDisplay” na collectionView w widoku rodzicaDidAppear:
źródło
Podczas używania
UICollectionViewDelegateFlowLayout
uważaj na to, co zwraca ta funkcja. Zarównowidth
iheight
powinny być większe niż0
. Użyłemwindow
jako odniesienia do ramki, ale ze względu na skomplikowaną hierarchię widoku okno byłonil
w czasie wykonywania. Jeśli potrzebujesz, dostosuj szerokość elementu na podstawie szerokości ekranuUIScreen.main.bounds
.źródło
W moim przypadku miałem
collectionView
w sposóbUIStackView
zalignment = .center
. WięccollectionView
nie miały szerokości. Po ustawieniustackView.alignment
na.fill
wszystko było w porządku.źródło
W moim przypadku aktualizuję wysokość self.view (superview kolekcji collectionView) przez autolayout i MUSZĘ wywołać
layoutIfNeeded
po tym.źródło
W moim przypadku musiałem dostosować szacowany rozmiar treści. rozmiar treści tego nie zrobił.
źródło
Miałem podobny problem. Ale zamiast tego
cellForItemAtIndexPath
został wywołany, gdy liczba elementów była> 1, ale nie wtedy, gdy był tylko jeden element. Wypróbowałem wiele z proponowanych tutaj rozwiązań i podobnie jak wiele stwierdziłem, że ma to związek z wymiarowaniem przedmiotów. Dla mnie rozwiązaniem była zmiana szacunkowego rozmiaruUICollectionView
z automatycznego na niestandardowy .źródło
Zatopiłem się trochę w tym problemie, który pojawił się z CollectionView w kontrolerze widoku Contained załadowanym z serii ujęć. Skończyło się na usunięciu zawartego kontrolera widoku i odtworzeniu go w scenorysie, a to wydawało się pozbyć problemu. Domyślam się, że miało miejsce jakieś uszkodzenie storyboardu.
źródło