Hanya kedua kalinya saya menggunakan UICollectionView dan mungkin saya telah menggigit lebih dari yang bisa saya kunyah tetapi bagaimanapun:
Saya mengimplementasikan UICollectionView (myCollectionView) yang menggunakan UICollectionViewCell kustom yang telah saya subkelas. Sel subclass (FullReceiptCell) berisi UITableView dan merupakan ukuran viewcontroller. Saya mencoba untuk memungkinkan pengguliran horizontal antara FullReceiptCells.
UICollectionViewController subclass yang berisi myCollectionView sedang didorong ke tumpukan pengontrol nav. Saat ini, loas myCollectionView dan pengguliran horizontal diaktifkan. Namun, tidak ada sel yang terlihat. Saya sudah konfirmasi itu
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
telah berjalan dan mengembalikan integer yang lebih besar dari 0. Saya juga telah mengonfirmasi bahwa delegasi dan sumber data myCollectionView disetel dengan benar di IB ke UICollectionViewController subclass.
Metode di mana sel akan dimuat:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
tidak dipanggil.
Di sinilah saya mendorong UICollectionViewController dan metode viewDidLoad saya di dalam pengontrol itu (CATATAN: initWithBill adalah menimpa penginisialisasi normal):
Di file ViewControllers .m sebelumnya:
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
Di 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];
Ada petunjuk mengapa tidak dipanggil?
sumber
Jawaban:
Bagi yang tersandung disini nanti .... alasannya:
tidak dipanggil karena tinggi itemSize untuk collectionViewFlowLayout terlalu besar.
Jika saya mengubah tinggi menjadi 410, itu akan mengeksekusi cellForItemAtIndexPath.
sumber
Adjust Scroll View Insets
di ViewController Anda di Storyboard.Dalam kasus saya, itu karena kelas tata letak saya salah disubkelas dari,
UICollectionViewLayout
bukanUICollectionViewFlowLayout
sumber
CellForItemAtIndexPath tidak akan dipanggil jika Anda tidak memberikan informasi ukuran konten ke tampilan koleksi.
Dalam kasus yang terakhir, Anda juga akan mengamati bahwa layoutAttributesForElementsRect Anda juga tidak dipanggil. Alasannya adalah Anda belum menentukan berapa ukuran konten Anda dan secara default ukurannya adalah CGSizeZero. Ini pada dasarnya memberi tahu tampilan koleksi bahwa Anda tidak memiliki konten apa pun untuk dilukis sehingga tidak repot menanyakan atribut atau sel kepada Anda.
Jadi, cukup timpa collectionViewContentSize dan berikan ukuran yang sesuai di sana, itu akan menyelesaikan masalah Anda.
sumber
collectionViewContentSize
salah mengembalikan 0 untuk lebarnya, itulah mengapacellForItemAtIndexPath
tidak dipanggil.Mungkin saya hanya mengabaikannya, tetapi tampaknya delegasi dan sumber data Anda hilang. Di file header Anda, pastikan Anda telah menambahkan ini:
dan dalam metode viewDidLoad Anda, tambahkan ini:
Selain itu, jika Anda memuatnya melalui .xib, pastikan Anda telah menghubungkan IBOutlet ke UICollectionView.
sumber
Untuk hierachy tampilan yang lebih rumit, silakan periksa blog ini . Itu menyelamatkan hidup saya!
sumber
Jika kelas Anda adalah subclass dari UICollectionviewController dan Anda membuat collectionView secara terprogram, gunakan
sumber
Saya menggunakan autolayout, dan dalam kasus saya, batasan tinggi tidak ada
sumber
Masalah saya adalah saya memiliki 2 tampilan koleksi dalam tampilan yang sama, dan keduanya berbagi
UICollectionViewFlowLayout
contoh yang dihitung . Setelah saya membuat contoh terpisah dari tata letak aliran yang sama, itu berfungsi dengan baik.sumber
Dalam kasus saya, apa yang saya lupa lakukan dengan bodohnya adalah mengimplementasikan
UICollectionViewDataSource
metode protokolnumberOfItemsInSection
, jadi itu adalah hal lain untuk diperiksa.sumber
Selain itu, pastikan reloadData tidak dipanggil saat tampilan koleksi diperbarui dengan animasi (sisipkan, hapus, perbarui, atau performBatchUpdates).
sumber
Dalam kasus saya, set
collectionView.prefetchingEnabled = NO;
memecahkan masalah saya. Hanya berfungsi di iOS 10.sumber
Itu terjadi pada saya ketika tinggi item == 0 dengan memperbaiki metode cellForItem dipanggil.
sumber
Sepuluh menit yang lalu saya juga mengalami masalah ini, saya melakukan kesalahan konyol.
Tujuan saya adalah menggunakan UICollectionViewFlowLayout,
Tetapi karena kesalahan, saya menggunakan UICollectionViewLayout.
sumber
Dalam kasus saya, mengubah tembus UINavigationBar menjadi NO memecahkan masalah.
sumber
Di Xcode 7.0.1, kami mendapatkan masalah ini saat kami menyalin papan cerita dan kode yang menyertai dari proyek lain. Tampilan koleksi memiliki tata letak aliran khusus yang disetel di papan cerita. Solusinya adalah:
Sekarang berhasil :)
sumber
Pastikan juga
numberOfSectionsInCollectionView
mengembalikan bilangan bulat positif.Harus ada setidaknya satu bagian dalam koleksi.
sumber
Pastikan - (NSInteger) collectionView: numberOfItemsInSection: mengembalikan nilai positif (baca, lebih besar dari nol). Ini mungkin masalah penempatan [self.collectionView reloadData]; di penangan penyelesaian.
sumber
Saya lupa menyetel autoresizing mask ke false pada tampilan koleksi:
sumber
Ini bisa menjadi masalah tata letak yang nyata. Periksa peringatan tata letak dari konsol, jika ada.
sumber
Dalam kasus saya, tampilan koleksi tidak sepenuhnya terlihat dalam tampilan induknya karena kendala tata letak otomatis yang salah. Jadi memperbaiki batasan membuat tampilan koleksi semua terlihat dan cellForItemAtIndexPath dipanggil.
sumber
Dalam properti storyboard / xib UICollectionView cellSize HARUS tidak {0, 0}
sumber
Jika Anda menggunakan protokol tampilan koleksi, Anda harus menghubungkan protokol
CollectionViewDataSource
danCollectionViewDelegate
ke ViewController Anda.sumber
Hal yang sama terjadi pada saya. Saya memiliki 2 UICollectionViews dan saya menghapusnya sekali karena saya tidak membutuhkannya. Setelah itu saya menyadari bahwa CellForItemAtIndexPath tidak dipanggil tetapi metode lain yang diperlukan. Saya mencoba semua hal di atas tetapi kemudian saya melakukan sihir standar. Menghapus tampilan koleksi dari storyboard dan ditambahkan lagi. Kemudian itu mulai bekerja. Tidak yakin mengapa dan saya tidak memiliki penjelasan tetapi mungkin beberapa masalah koneksi.
sumber
Baru saja menyelesaikan masalah ini, untuk situasi yang agak spesifik.
Dalam kasus saya, saya secara manual menginisialisasi UICollectionViewController di ViewController induk, dan kemudian menambahkan tampilan UICollectionViewController sebagai subview.
Saya menyelesaikan masalah dengan memanggil 'setNeedsLayout' dan / atau 'setNeedsDisplay' di collectionView di viewDidAppear induk:
sumber
Saat menggunakan
UICollectionViewDelegateFlowLayout
berhati-hatilah pada apa yang dikembalikan fungsi ini. Keduanyawidth
danheight
harus lebih besar dari0
. Saya digunakanwindow
sebagai referensi bingkai tetapi karena jendela hierarki tampilan yang rumitnil
saat runtime. Jika Anda perlu menyesuaikan lebar elemen berdasarkan penggunaan lebar layarUIScreen.main.bounds
.sumber
Dalam kasus saya saya punya
collectionView
dalamUIStackView
denganalignment = .center
. JadicollectionView
tidak punya lebar. Saat mengaturstackView.alignment
ke.fill
semuanya baik-baik saja.sumber
Bagi saya, saya memperbarui tinggi self.view (superview collectionView) melalui autolayout, dan HARUS memanggilnya
layoutIfNeeded
setelah itu.sumber
Dalam kasus saya, saya harus menyesuaikan perkiraan ukuran Konten. ukuran konten tidak melakukannya.
sumber
Saya mengalami masalah serupa. Tapi malah
cellForItemAtIndexPath
dipanggil saat jumlah item> 1, tapi tidak saat item hanya ada satu. Saya mencoba banyak solusi yang diusulkan di sini dan mirip dengan banyak solusi yang saya temukan ada hubungannya dengan ukuran item. Bagi saya solusinya adalah mengubah ukuran perkiraanUICollectionView
dari Otomatis ke Kustom .sumber
Saya menghabiskan sedikit waktu dengan masalah yang akan datang ini dengan CollectionView dalam pengontrol tampilan Terkandung yang dimuat dari storyboard. Saya akhirnya hanya menghapus pengontrol tampilan yang ada, dan membuatnya kembali di storyboard, dan ini sepertinya menyingkirkan masalah. Dugaan saya adalah ada semacam korupsi papan cerita yang telah terjadi.
sumber