Saya ingin mengubah ofset tabel ketika beban selesai dan offset itu tergantung pada jumlah sel yang dimuat pada tabel.
Apakah tetap di SDK untuk mengetahui kapan pemuatan uitableview selesai? Saya tidak melihat apa pun pada delegasi maupun pada protokol sumber data.
Saya tidak bisa menggunakan hitungan sumber data karena memuat sel yang terlihat saja.
ios
iphone
uitableview
emenegro
sumber
sumber
Jawaban:
Tingkatkan ke jawaban @RichX:
lastRow
bisa keduanya[tableView numberOfRowsInSection: 0] - 1
atau((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row
. Jadi kodenya adalah:UPDATE: Baiklah, komentar @ htafoya benar. Jika Anda ingin kode ini mendeteksi akhir pemuatan semua data dari sumber, itu tidak akan terjadi, tetapi itu bukan pertanyaan awal. Kode ini untuk mendeteksi ketika semua sel yang seharusnya terlihat ditampilkan.
willDisplayCell:
digunakan di sini untuk UI lebih halus (sel tunggal biasanya menampilkan cepat setelahwillDisplay:
panggilan). Anda juga bisa mencobanyatableView:didEndDisplayingCell:
.sumber
viewForFooterInSection
metode ini.Versi Swift 3 & 4 & 5:
sumber
Saya selalu menggunakan solusi yang sangat sederhana ini:
sumber
[tableView numberOfRowsInSection: 0] - 1
. Anda harus mengganti0
dengan nilai yang dibutuhkan. Tapi bukan itu masalahnya. Masalahnya adalah bahwa UITableView memuat hanya terlihat. Namun((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row
menyelesaikan masalah.Inilah opsi lain yang sepertinya berhasil untuk saya. Dalam metode delegasi viewForFooter periksa apakah itu bagian terakhir dan tambahkan kode Anda di sana. Pendekatan ini datang ke pikiran setelah menyadari bahwa willDisplayCell tidak memperhitungkan footer jika Anda memilikinya.
Saya menemukan pendekatan ini bekerja paling baik jika Anda mencari untuk menemukan pemuatan akhir untuk keseluruhan
UITableView
, dan bukan hanya sel yang terlihat. Tergantung pada kebutuhan Anda, Anda mungkin hanya menginginkan sel yang terlihat, dalam hal ini jawaban folex adalah rute yang baik.sumber
nil
daritableView:viewForFooterInSection:
berantakan dengan tata letak saya di iOS 7 menggunakan Tata Letak Otomatis.return CGRectMake(0,0,0,0);
self.tableView.sectionFooterHeight = 0
. Either way, tampaknya untuk memasukkan tampilan bagian footer dengan ketinggian sekitar 10. Saya yakin saya bisa memperbaikinya dengan menambahkan batasan 0-tinggi pada tampilan yang saya kembalikan. Bagaimanapun, saya baik karena saya benar-benar ingin mengetahui cara memulai UITableView pada sel terakhir tetapi melihatnya terlebih dahulu.Solusi Swift 2:
sumber
Menggunakan API pribadi:
Menggunakan API publik:
Sebuah desain yang mungkin lebih baik adalah dengan menambahkan sel-sel yang terlihat ke set, maka ketika Anda perlu memeriksa apakah tabel dimuat, Anda dapat melakukan perulangan for sekitar set ini, misalnya
sumber
Untuk versi jawaban yang dipilih di Swift 3:
Saya membutuhkan variabel isLoadingTableView karena saya ingin memastikan tabel selesai memuat sebelum saya membuat pilihan sel default. Jika Anda tidak memasukkan ini maka setiap kali Anda menggulir tabel itu akan meminta kode Anda lagi.
sumber
Pendekatan terbaik yang saya tahu adalah jawaban Eric di: Dapatkan pemberitahuan ketika UITableView telah selesai meminta data?
Pembaruan: Agar berfungsi, saya harus memasukkan panggilan ini
-tableView:cellForRowAtIndexPath:
sumber
Untuk mengetahui kapan tampilan tabel selesai memuat kontennya, pertama-tama kita harus memiliki pemahaman dasar tentang bagaimana tampilan ditampilkan di layar.
Dalam siklus hidup suatu aplikasi, ada 4 momen kunci:
Waktu 2 dan 3 benar-benar terpisah. MengapaUntuk alasan kinerja, kami tidak ingin melakukan semua perhitungan saat 3 setiap kali modifikasi dilakukan.
Jadi, saya pikir Anda menghadapi kasus seperti ini:
Ada apa di sini?
Seperti tampilan apa pun, tampilan tabel memuat ulang kontennya dengan malas. Sebenarnya, jika Anda menelepon
reloadData
berkali-kali tidak akan menimbulkan masalah kinerja. Tampilan tabel hanya menghitung ulang ukuran kontennya berdasarkan implementasi delegasinya dan menunggu saat 3 untuk memuat sel-selnya. Kali ini disebut tata letak pass.Oke, bagaimana cara masuk ke tata letak lulus?
Selama pass tata letak, aplikasi menghitung semua bingkai hierarki tampilan. Untuk terlibat, Anda dapat mengganti metode khusus
layoutSubviews
,updateLayoutConstraints
dll dalam aUIView
dan metode yang setara dalam subkelas pengontrol tampilan.Itulah yang dilakukan tampilan tabel. Ini menimpa
layoutSubviews
dan berdasarkan pada implementasi delegasi Anda menambah atau menghapus sel. Itu panggilancellForRow
tepat sebelum menambahkan dan meletakkan sel baru,willDisplay
tepat setelah. Jika Anda meneleponreloadData
atau baru saja menambahkan tampilan tabel ke hierarki, tampilan tabel menambahkan sebanyak mungkin sel untuk mengisi bingkai pada saat penting ini.Baiklah, tapi sekarang, bagaimana cara mengetahui kapan tampilan tabel selesai memuat ulang isinya?
Kita sekarang dapat mengulangi pertanyaan ini: bagaimana cara mengetahui kapan tampilan tabel telah selesai menyusun subview?
• Cara termudah adalah masuk ke tata letak tampilan tabel:
Perhatikan bahwa metode ini dipanggil beberapa kali dalam siklus hidup tampilan tabel. Karena gulir dan perilaku dequeue dari tampilan tabel, sel-sel dimodifikasi, dihapus dan sering ditambahkan. Tapi itu berhasil, tepat setelah
super.layoutSubviews()
sel-sel dimuat. Solusi ini setara dengan menungguwillDisplay
acara jalur indeks terakhir. Acara ini disebut selama pelaksanaanlayoutSubviews
tampilan tabel untuk setiap sel yang ditambahkan.• Cara lain adalah dipanggil ketika aplikasi menyelesaikan pass tata letak.
Seperti yang dijelaskan dalam dokumentasi , Anda dapat menggunakan opsi dari
UIView.animate(withDuration:completion)
:Solusi ini berfungsi tetapi layar akan menyegarkan sekali antara waktu tata letak selesai dan waktu blok dipanggil. Ini setara dengan
DispatchMain.async
solusi tetapi ditentukan.• Atau, saya lebih suka memaksakan tata letak tampilan tabel
Ada metode khusus untuk memaksa tampilan apa pun untuk segera menghitung frame subview-nya
layoutIfNeeded
:Namun hati-hati, hal itu akan menghapus pemuatan malas yang digunakan oleh sistem. Memanggil metode itu berulang kali dapat menciptakan masalah kinerja. Pastikan mereka tidak akan dipanggil sebelum bingkai tampilan tabel dihitung, jika tidak tampilan tabel akan dimuat lagi dan Anda tidak akan diberitahu.
Saya pikir tidak ada solusi yang sempurna. Kelas subkelas dapat menyebabkan trubles. Layout tata letak dimulai dari atas dan pergi ke bawah sehingga tidak mudah untuk mendapatkan pemberitahuan ketika semua tata letak dilakukan. Dan
layoutIfNeeded()
dapat membuat masalah kinerja dll. Tetapi mengetahui pilihan-pilihan itu, Anda harus dapat berpikir pada satu alternatif yang sesuai dengan kebutuhan Anda.sumber
Inilah cara Anda melakukannya di Swift 3:
sumber
di sini adalah bagaimana saya melakukannya di Swift 3
sumber
Inilah yang akan saya lakukan.
Di kelas dasar Anda (bisa berupa rootVC BaseVc dll),
A. Tulis Protokol untuk mengirim panggilan balik "DidFinishReloading".
B. Tulis metode generik untuk memuat ulang tampilan tabel.
Dalam implementasi metode kelas dasar, panggil reloadData diikuti oleh delegateMethod dengan penundaan.
Konfirmasikan ke protokol penyelesaian ulang di semua pengontrol tampilan tempat Anda membutuhkan panggilan balik.
Referensi: https://discussions.apple.com/thread/2598339?start=0&tstart=0
sumber
@folex jawabannya benar.
Tetapi itu akan gagal jika tableView memiliki lebih dari satu bagian ditampilkan pada satu waktu.
sumber
Di Swift Anda dapat melakukan sesuatu seperti ini. Kondisi berikut akan benar setiap kali Anda mencapai ujung tableView
sumber
Saya tahu ini dijawab, saya hanya menambahkan rekomendasi.
Sesuai dokumentasi berikut
https://www.objc.io/issues/2-concurrency/thread-safe-class-design/
Memperbaiki masalah waktu dengan dispatch_async adalah ide yang buruk. Saya sarankan kita harus menangani ini dengan menambahkan FLAG atau sesuatu.
sumber
Jika Anda memiliki beberapa bagian, berikut ini cara mendapatkan baris terakhir di bagian terakhir (Swift 3):
sumber
Secara tidak sengaja saya menemukan solusi ini:
Anda perlu mengatur footerView sebelum mendapatkan contentSize misalnya di viewDidLoad. Btw. mengatur footeView memungkinkan Anda menghapus pemisah "yang tidak digunakan"
sumber
Apakah Anda mencari jumlah total item yang akan ditampilkan dalam tabel atau total item yang saat ini terlihat? Either way .. Saya percaya bahwa metode 'viewDidLoad' dijalankan setelah semua metode sumber data dipanggil. Namun, ini hanya akan berfungsi pada pemuatan pertama data (jika Anda menggunakan ViewController alokasi tunggal).
sumber
Saya menyalin kode Andrew dan memperluasnya ke akun untuk kasus di mana Anda hanya memiliki 1 baris dalam tabel. Ini bekerja sejauh ini untuk saya!
CATATAN: Saya hanya menggunakan 1 bagian dari kode Andrew, jadi ingatlah itu ..
sumber
Di iOS7.0x solusinya agak berbeda. Inilah yang saya pikirkan.
sumber
Tujuan C
Cepat
sumber
UICollectionView
sejauh yang saya mengerti.