Saya telah memperbarui aplikasi saya untuk berjalan di iOS 7 yang sebagian besar berjalan lancar. Saya telah memperhatikan di lebih dari satu aplikasi bahwa reloadData
metode a UICollectionViewController
tidak berfungsi seperti dulu.
Saya akan memuat UICollectionViewController
, mengisi UICollectionView
dengan beberapa data seperti biasa. Ini berfungsi dengan baik untuk pertama kalinya. Namun jika saya meminta data baru (mengisi UICollectionViewDataSource
), dan kemudian memanggil reloadData
, itu akan meminta sumber data untuk numberOfItemsInSection
dan numberOfSectionsInCollectionView
, tetapi tampaknya tidak memanggil cellForItemAtIndexPath
jumlah yang tepat.
Jika saya mengubah kode menjadi hanya memuat ulang satu bagian, maka itu akan berfungsi dengan baik. Tidak masalah bagi saya untuk mengubahnya, tetapi saya rasa saya tidak harus melakukannya. reloadData
harus memuat ulang semua sel yang terlihat sesuai dengan dokumentasi.
Apakah ada orang lain yang melihat ini?
sumber
reloadData
setelah viewDidAppear tampaknya menyelesaikan masalah, solusi yang mengerikan, dan perlu diperbaiki. Saya harap seseorang membantu di sini.Jawaban:
Paksakan ini di utas utama:
sumber
Dalam kasus saya, jumlah sel / bagian dalam sumber data tidak pernah berubah dan saya hanya ingin memuat ulang konten yang terlihat di layar ..
Saya berhasil menyiasati ini dengan menelepon:
kemudian:
sumber
performBatchUpdates:completion:
blok?Saya mengalami masalah yang persis sama, namun saya berhasil menemukan apa yang salah. Dalam kasus saya, saya memanggil reloadData dari collectionView: cellForItemAtIndexPath: yang tampaknya tidak benar.
Mengirim panggilan reloadData ke antrian utama memperbaiki masalah sekali dan selamanya.
sumber
reloadData
dipanggil oleh pengamat perubahan.collectionView(_:willDisplayCell:forItemAtIndexPath:)
Memuat ulang beberapa item tidak berhasil untuk saya. Dalam kasus saya, dan hanya karena collectionView yang saya gunakan hanya memiliki satu bagian, saya cukup memuat ulang bagian tersebut. Kali ini isinya dimuat ulang dengan benar. Aneh bahwa ini hanya terjadi di iOS 7 (7.0.3)
sumber
Saya memiliki masalah yang sama dengan reloadData di iOS 7. Setelah sesi debug yang lama, saya menemukan masalahnya.
Di iOS7, reloadData di UICollectionView tidak membatalkan pembaruan sebelumnya yang belum selesai (Pembaruan yang memanggil di dalam performBatchUpdates: block).
Solusi terbaik untuk mengatasi bug ini, menghentikan semua pembaruan yang saat ini diproses dan memanggil reloadData. Saya tidak menemukan cara untuk membatalkan atau menghentikan blok performBatchUpdates. Oleh karena itu, untuk mengatasi bug tersebut, saya menyimpan sebuah flag yang menunjukkan jika ada blok performBatchUpdates yang sedang diproses. Jika tidak ada blok pembaruan yang saat ini diproses, saya dapat segera memanggil reloadData dan semuanya berfungsi seperti yang diharapkan. Jika ada blok pembaruan yang saat ini diproses, saya akan memanggil reloadData pada blok lengkap performBatchUpdates.
sumber
Cepat 5 - 4 - 3
Cepat 2
sumber
Saya juga punya masalah ini. Secara kebetulan saya menambahkan tombol di atas tampilan koleksi untuk memaksa pemuatan ulang untuk pengujian - dan tiba-tiba metode tersebut mulai dipanggil.
Juga hanya menambahkan sesuatu yang sederhana seperti
akan menyebabkan metode dipanggil
Juga saya bermain-main dengan ukuran bingkai - dan voila metode dipanggil.
Ada banyak bug dengan iOS7 UICollectionView.
sumber
Anda bisa menggunakan metode ini
Anda dapat menambahkan semua
indexPath
objekUICollectionView
ke dalam arrayarrayOfAllIndexPaths
dengan mengulang loop untuk semua bagian dan baris dengan menggunakan metode di bawah iniSaya harap Anda mengerti dan ini dapat menyelesaikan masalah Anda. Jika Anda membutuhkan penjelasan lebih lanjut, silakan balas.
sumber
Solusi yang diberikan oleh Shaunti Fondrisi hampir sempurna. Tapi seperti sepotong kode atau kode seperti enqueue pelaksanaan
UICollectionView
'sreloadData()
untukNSOperationQueue
' smainQueue
memang menempatkan waktu eksekusi ke awal acara loop berikutnya dalam loop berjalan, yang bisa membuatUICollectionView
pembaruan dengan sebuah film.Untuk mengatasi masalah ini. Kita harus meletakkan waktu eksekusi dari potongan kode yang sama ke akhir loop peristiwa saat ini tetapi bukan awal berikutnya. Dan kita bisa mencapai ini dengan memanfaatkan
CFRunLoopObserver
.CFRunLoopObserver
mengamati semua aktivitas menunggu sumber input dan aktivitas masuk dan keluar dari run loop.Di antara aktivitas tersebut,
.AfterWaiting
dapat diamati saat loop peristiwa saat ini akan segera berakhir, dan.BeforeWaiting
dapat diamati saat loop peristiwa berikutnya baru saja dimulai.Karena hanya ada satu
NSRunLoop
instance perNSThread
danNSRunLoop
benar - benar mendorongNSThread
, kita dapat menganggap bahwa akses yang berasal dariNSRunLoop
instance yang sama selalu tidak pernah melintasi utas.Berdasarkan poin yang disebutkan sebelumnya, sekarang kita dapat menulis kode: dispatcher tugas berbasis NSRunLoop:
Dengan kode sebelumnya, sekarang kita bisa mengirim pelaksanaan
UICollectionView
'sreloadData()
ke akhir acara loop arus dengan seperti sepotong kode:Faktanya, operator tugas berbasis NSRunLoop seperti itu telah ada di salah satu kerangka kerja pribadi saya: Nest. Dan inilah repositori di GitHub: https://github.com/WeZZard/Nest
sumber
itu berhasil untuk saya.
sumber
Terima kasih pertama-tama untuk utas ini, sangat membantu. Saya memiliki masalah serupa dengan Reload Data kecuali gejalanya adalah bahwa sel tertentu tidak dapat lagi dipilih secara permanen sedangkan yang lain bisa. Tidak ada panggilan ke metode indexPathsForSelectedItems atau yang setara. Debugging menunjukkan Reload Data. Saya mencoba kedua opsi di atas; dan akhirnya mengadopsi opsi ReloadItemsAtIndexPaths karena opsi lain tidak berfungsi dalam kasus saya atau membuat tampilan koleksi berkedip selama satu mili-detik atau lebih. Kode di bawah berfungsi dengan baik:
sumber
Itu terjadi pada saya juga di iOS 8.1 sdk, tetapi saya melakukannya dengan benar ketika saya perhatikan bahwa bahkan setelah memperbarui
datasource
metodenumberOfItemsInSection:
tersebut tidak mengembalikan jumlah item baru. Saya memperbarui hitungan dan membuatnya berfungsi.sumber
Apakah Anda menyetel UICollectionView.contentInset? hapus edgeInset kiri dan kanan, semuanya baik-baik saja setelah saya hapus, bug masih ada di iOS8.3.
sumber
Periksa apakah masing-masing metode UICollectionView Delegate melakukan apa yang Anda harapkan. Misalnya, jika
tidak mengembalikan ukuran yang valid, pemuatan ulang tidak akan berfungsi ...
sumber
coba kode ini.
sumber
Inilah cara kerjanya untuk saya di Swift 4
sumber
sumber