Saya memiliki UITableView yang dalam beberapa kasus adalah legal untuk dikosongkan. Jadi, alih-alih menampilkan gambar latar belakang aplikasi, saya lebih suka mencetak pesan bersahabat di layar, seperti:
Daftar ini sekarang kosong
Apa cara termudah untuk melakukannya?
iphone
ios
uitableview
uiview
kategori
sumber
sumber
Jawaban:
Properti backgroundView UITableView adalah teman Anda.
Di
viewDidLoad
atau di mana punreloadData
Anda harus menentukan apakah ada tabel Anda kosong atau tidak dan perbarui properti backgroundView UITableView dengan UIView yang berisi UILabel atau setel ke nil. Itu dia.Hal ini tentu saja memungkinkan untuk membuat sumber data UITableView melakukan tugas ganda dan mengembalikan sel khusus "daftar kosong", itu menurut saya sebagai kludge. Tiba-tiba
numberOfRowsInSection:(NSInteger)section
harus menghitung jumlah baris dari bagian lain yang tidak diminta untuk memastikannya juga kosong. Anda juga perlu membuat sel khusus yang memiliki pesan kosong. Juga jangan lupa bahwa Anda mungkin perlu mengubah ketinggian sel Anda untuk mengakomodasi pesan kosong. Ini semua bisa dilakukan tetapi sepertinya plester di atas plester.sumber
backgroundView
properti tersembunyi adalah cara terbaik. DenganDZNEmptyDataSet
, kita harus menggunakanemptyDataSetSource
tableView.backgroundView!.userInteraction = true
setelah baris Anda mengaturtableView.backgroundView = constructMyViewWithButtons()
, atau bagaimanapun Anda mengaturnya.Sama seperti jawaban Jhonston, tapi saya lebih suka sebagai perpanjangan:
Pemakaian:
sumber
func numberOfSections(in tableView: UITableView) -> Int
metodeBerdasarkan jawaban di sini, berikut adalah kelas singkat yang saya buat yang dapat Anda gunakan di
UITableViewController
.Dalam diri Anda,
UITableViewController
Anda dapat memanggil ininumberOfSectionsInTableView(tableView: UITableView) -> Int
Dengan sedikit bantuan dari http://www.appcoda.com/pull-to-refresh-uitableview-empty/
sumber
viewController.tableView.separatorStyle = .none
tidak diperlukan.Saya merekomendasikan perpustakaan berikut: DZNEmptyDataSet
Cara termudah untuk menambahkannya dalam proyek Anda adalah menggunakannya dengan Cocaopods seperti:
pod 'DZNEmptyDataSet'
Di TableViewController Anda, tambahkan pernyataan import berikut (Swift):
Kemudian pastikan kelas Anda sesuai dengan
DNZEmptyDataSetSource
danDZNEmptyDataSetDelegate
suka:Di
viewDidLoad
tambahkan baris kode berikut:Sekarang yang harus Anda lakukan untuk menunjukkan keadaan kosong adalah:
Metode ini tidak wajib, juga memungkinkan untuk hanya menampilkan keadaan kosong tanpa tombol, dll.
Untuk Swift 4
sumber
Salah satu cara untuk melakukannya adalah memodifikasi sumber data Anda untuk ditampilkan
1
ketika jumlah baris adalah nol, dan untuk menghasilkan sel tujuan khusus (mungkin dengan pengenal sel yang berbeda) dalamtableView:cellForRowAtIndexPath:
metode.Ini mungkin menjadi agak rumit jika Anda memiliki beberapa pengontrol tampilan tabel yang perlu Anda pertahankan, karena seseorang pada akhirnya akan lupa untuk menyisipkan cek nol. Pendekatan yang lebih baik adalah membuat implementasi terpisah dari
UITableViewDataSource
implementasi yang selalu mengembalikan satu baris dengan pesan yang dapat dikonfigurasi (sebut sajaEmptyTableViewDataSource
). Ketika data yang dikelola oleh pengontrol tampilan tabel Anda berubah, kode yang mengelola perubahan akan memeriksa apakah datanya kosong. Jika tidak kosong, setel pengontrol tampilan tabel Anda dengan sumber data regulernya; jika tidak, setel dengan instanceEmptyTableViewDataSource
yang telah dikonfigurasi dengan pesan yang sesuai.sumber
deleteRowsAtIndexPaths:withRowAnimation:
karena nomor yang dikembalikan darinumberOfRowsInSection
harus cocok dengan hasil $ numRows - $ rowDeleted.Saya telah menggunakan pesan titleForFooterInSection untuk ini. Saya tidak tahu apakah ini suboptimal atau tidak, tetapi berhasil.
sumber
return tableView.numberOfRowsInSection(section) == 0 ? "This list is now empty" : nil
Jadi untuk solusi yang lebih aman:
dan untuk
UICollectionView
juga:Solusi yang Lebih Umum:
sumber
Saya hanya dapat merekomendasikan untuk menyeret & menjatuhkan UITextView di dalam TableView setelah sel. Buat koneksi ke ViewController dan sembunyikan / tampilkan jika perlu (misalnya, setiap kali tabel dimuat ulang).
sumber
Menggunakan backgroundView baik-baik saja, tetapi tidak menggulir dengan baik seperti di Mail.app.
Saya melakukan sesuatu yang mirip dengan apa yang dilakukan xtravar .
Saya menambahkan tampilan di luar hierarki tampilan
tableViewController
.Kemudian saya menggunakan kode berikut di
tableView:numberOfRowsInSection:
:Pada dasarnya saya menambahkan
emptyStateView
sebagai subview daritableView
objek. Karena pemisah akan tumpang tindih dengan tampilan, saya mengatur warnanya keclearColor
. Untuk kembali ke warna pemisah default, Anda bisa mengaturnya kenil
.sumber
tableHeaderView
, dan memastikan ukurannya berubah agar pas .Menggunakan Pengontrol Tampilan Kontainer adalah cara yang tepat untuk melakukannya sesuai dengan Apple .
Saya meletakkan semua pandangan keadaan kosong saya di Storyboard terpisah. Masing-masing di bawah subclass UIViewController miliknya sendiri. Saya menambahkan konten langsung di bawah tampilan root mereka. Jika ada tindakan / tombol yang diperlukan, Anda sekarang sudah memiliki pengontrol untuk menanganinya.
Maka itu hanya masalah membuat contoh pengontrol tampilan yang diinginkan dari Storyboard itu, menambahkannya sebagai pengontrol tampilan anak dan menambahkan tampilan kontainer ke hierarki tableView (sub tampilan). Tampilan status kosong Anda juga akan dapat di-scroll, yang terasa nyaman dan memungkinkan Anda menerapkan tarik untuk menyegarkan.
Baca bab 'Menambahkan Pengontrol Tampilan Anak ke Konten Anda' untuk bantuan tentang cara menerapkan.
Pastikan Anda menyetel bingkai tampilan anak sebagai
(0, 0, tableView.frame.width, tableView.frame.height)
dan semuanya akan dipusatkan dan disejajarkan dengan benar.sumber
Pertama, masalah dengan pendekatan populer lainnya.
BackgroundView
Tampilan latar belakang tidak berada di tengah dengan baik jika Anda menggunakan kasus sederhana untuk menyetelnya menjadi UILabel.
Sel, header, atau footer untuk menampilkan pesan
Ini mengganggu kode fungsional Anda dan menyebabkan kasus tepi yang aneh. Jika Anda ingin memusatkan pesan Anda dengan sempurna, itu menambah tingkat kerumitan lainnya.
Menggulung pengontrol tampilan tabel Anda sendiri
Anda kehilangan fungsionalitas bawaan, seperti refreshControl, dan menemukan kembali roda. Tetap gunakan UITableViewController untuk hasil terbaik yang dapat dirawat.
Menambahkan UITableViewController sebagai pengontrol tampilan anak
Saya merasa Anda akan berakhir dengan masalah contentInset di iOS 7+ - plus mengapa memperumit masalah?
Solusi saya
Solusi terbaik yang saya temukan (dan, memang, ini tidak ideal) adalah membuat tampilan khusus yang dapat duduk di atas tampilan gulir dan bertindak sesuai. Ini jelas menjadi rumit di iOS 7 dengan kegilaan contentInset, tetapi itu bisa dilakukan.
Hal-hal yang harus Anda perhatikan:
Setelah Anda mengetahui ini sekali dalam satu subkelas UIView, Anda dapat menggunakannya untuk semuanya - memuat spinner, menonaktifkan tampilan, menampilkan pesan kesalahan, dll.
sumber
addSubView
akan dilampirkan ke tampilan tabel yang selalu membuat masalah dengan tata letak otomatis.Ini adalah solusi terbaik dan sederhana.
sumber
Tampilkan Pesan untuk daftar kosong, Apakah UITableView atau UICollectionView-nya .
Penggunaan:
ATAU:
Ingat: Jangan lupa untuk menghapus label pesan jika data akan datang setelah refresh.
sumber
Pilih Scene tableviewController Anda di storyboard
Seret dan lepas UIView Tambahkan label dengan pesan Anda (misalnya: Tidak Ada Data)
buat outlet UIView (katakanlah misalnya yournoDataView) di TableViewController Anda.
dan di viewDidLoad
self.tableView.backgroundView = yourNoDataView
sumber
Menggunakan Swift 4.2
sumber
Anda dapat menambahkan ini ke kelas Base Anda.
Tunjukkan seperti ini di kelas untuk mendapatkan data dari api.
Sembunyikan seperti ini.
sumber
Versi cepat tetapi bentuk yang lebih baik dan lebih sederhana. ** 3.0
Saya berharap itu sesuai dengan tujuan Anda ......
Di UITableViewController Anda.
Kelas Pembantu dengan fungsi:
sumber
Mungkin bukan solusi terbaik, tetapi saya melakukan ini dengan hanya meletakkan label di bagian bawah tabel saya dan jika baris = 0 maka saya menetapkannya beberapa teks. Cukup mudah, dan mencapai apa yang Anda coba lakukan dengan beberapa baris kode.
Saya memiliki dua bagian di tabel saya (pekerjaan dan sekolah)
sumber
Cara termudah dan tercepat untuk melakukannya adalah dengan menyeret label ke panel samping di bawah tableView. Buat outlet untuk label dan tableView dan tambahkan pernyataan if untuk menyembunyikan dan menampilkan label dan tabel sesuai kebutuhan. Atau Anda dapat menambahkan tableView.tableFooterView = UIView (frame: CGRect.zero) ini kepada Anda viewDidLoad () untuk memberikan persepsi pada tabel kosong bahwa ia tersembunyi jika tampilan tabel dan latar belakang memiliki warna yang sama.
sumber
Saya membuat beberapa perubahan sehingga kita tidak perlu memeriksa hitungan secara manual, juga saya menambahkan batasan untuk label sehingga tidak ada yang salah tidak peduli seberapa besar pesannya seperti yang ditunjukkan di bawah ini:
Pemakaian
sumber
Atau sebagai alternatif, Anda dapat menggunakan perpustakaan ringan yang dapat disesuaikan
SwiftEmptyState
sumber