UITableView
setel ke sel statis.
Apakah mungkin untuk menyembunyikan beberapa sel secara terprogram?
ios
objective-c
uitableview
Shmidt
sumber
sumber
IBOutletCollection
tetapi saya tidak melihat bagaimana itu akan membuat perbedaan. Saya hanya mengunduh kode kemarin jadi saya rasa ini bukan versi lama.Untuk menyembunyikan sel statis di UITable:
Di kelas delegasi kontroler UITableView Anda:
Tujuan-C:
Cepat:
Metode ini akan dipanggil untuk setiap sel dalam UITable. Setelah ia memanggilnya untuk sel yang ingin Anda sembunyikan, kami mengatur ketinggiannya ke 0. Kami mengidentifikasi sel target dengan membuat outlet untuknya:
sumber
ClipToBounds
masalah ini, Anda juga dapat mengatur sel ke tersembunyi. Bagi saya ini tampak lebih bersih. ;-)Cara terbaik adalah seperti yang dijelaskan dalam blog berikut ini http://ali-reynolds.com/2013/06/29/hide-cells-in-static-table-view/
sumber
Solusi saya menuju ke arah yang sama seperti Gareth, meskipun saya melakukan beberapa hal secara berbeda.
Ini dia:
1. Sembunyikan sel
Tidak ada cara untuk menyembunyikan sel secara langsung.
UITableViewController
adalah sumber data yang menyediakan sel statis, dan saat ini tidak ada cara untuk mengatakannya "tidak menyediakan sel x". Jadi kita harus menyediakan sumber data kita sendiri, yang didelegasikan kepadaUITableViewController
untuk mendapatkan sel statis.Paling mudah adalah dengan subkelas
UITableViewController
, dan menimpa semua metode yang perlu berperilaku berbeda saat menyembunyikan sel .Dalam kasus paling sederhana (tabel satu bagian, semua sel memiliki ketinggian yang sama), ini akan seperti ini:
Jika tabel Anda memiliki beberapa bagian, atau sel memiliki ketinggian yang berbeda, Anda perlu mengganti metode lainnya. Prinsip yang sama berlaku di sini: Anda perlu mengimbangi indexPath, bagian dan baris sebelum mendelegasikan ke super.
Juga perlu diingat bahwa parameter indexPath untuk metode seperti
didSelectRowAtIndexPath:
akan berbeda untuk sel yang sama, tergantung pada keadaan (yaitu jumlah sel yang disembunyikan). Jadi mungkin ide yang bagus untuk selalu mengimbangi parameter indexPath dan bekerja dengan nilai-nilai ini.2. Buat animasi perubahan
Seperti yang sudah dinyatakan Gareth, Anda mendapatkan gangguan besar jika Anda menghidupkan perubahan menggunakan
reloadSections:withRowAnimation:
metode.Saya menemukan bahwa jika Anda menelepon
reloadData:
segera setelah itu, animasinya jauh lebih baik (hanya gangguan kecil yang tersisa). Tabel ditampilkan dengan benar setelah animasi.Jadi yang saya lakukan adalah:
sumber
numberOfRowsInSection:
- sel statis dipanggil hanya ketika tabel memuat pertama kali. Ketika saya memanggil [self.tableView reloadData] -numberOfRowsInSection:
tidak pernah dipanggil lagi. HanyacellForRowAtIndexPath:
dipanggil. Apa yang saya lewatkan?cellOneOutlet.hidden = true
sekarang ganti metode di bawah ini, periksa status sel mana yang disembunyikan dan kembalikan tinggi 0 untuk sel-sel itu. Ini adalah salah satu dari banyak cara Anda dapat menyembunyikan sel apa pun di tabel statis dengan cepat.
sumber
let tableViewCell = super.tableView(tableView,cellForRowAtIndexPath: indexPath)
. Saya menganggap itu diganti olehlet tableViewCell = tableView.cellForRow(at: indexPath as IndexPath)
.UITableViewController
, saya tidak punyaUITableView
metode delegasi. Untuk dapat meneleponheightForRow
, apakah saya perlu memiliki metode lain juga?Saya datang dengan alternatif yang sebenarnya menyembunyikan bagian dan tidak menghapusnya. Saya mencoba pendekatan @ henning77, tetapi saya terus mengalami masalah ketika saya mengubah jumlah bagian dari UITableView statis. Metode ini telah bekerja dengan sangat baik untuk saya, tetapi saya terutama berusaha menyembunyikan bagian daripada baris. Saya berhasil menghapus beberapa baris dengan cepat, tetapi jauh lebih berantakan, jadi saya sudah mencoba untuk mengelompokkan beberapa hal menjadi bagian yang perlu saya perlihatkan atau sembunyikan. Berikut adalah contoh bagaimana saya menyembunyikan bagian:
Pertama saya mendeklarasikan properti NSMutableArray
Di viewDidLoad (atau setelah Anda menanyakan data Anda), Anda bisa menambahkan bagian yang ingin Anda sembunyikan ke array.
Kemudian mengimplementasikan metode delegasi TableView berikut
Kemudian atur tinggi header dan footer ke 1 untuk bagian tersembunyi karena Anda tidak dapat mengatur tinggi ke 0. Ini menyebabkan ruang 2 pixel tambahan, tetapi kita bisa menebusnya dengan menyesuaikan ketinggian header yang terlihat berikutnya.
Kemudian, jika Anda memiliki baris tertentu untuk disembunyikan Anda dapat menyesuaikan numberOfRowsInSection dan baris mana yang dikembalikan di cellForRowAtIndexPath. Dalam contoh ini di sini saya memiliki bagian yang memiliki tiga baris di mana tiga bisa kosong dan perlu dihapus.
Gunakan offsetIndexPath ini untuk menghitung indexPath untuk baris tempat Anda menghapus baris secara kondisional. Tidak diperlukan jika Anda hanya menyembunyikan bagian
Ada banyak metode untuk ditimpa, tetapi apa yang saya sukai dari pendekatan ini adalah bahwa itu dapat digunakan kembali. Atur array hiddenSections, tambahkan padanya, dan itu akan menyembunyikan bagian yang benar. Menyembunyikan barisnya sedikit lebih sulit, tapi mungkin. Kami tidak bisa hanya mengatur ketinggian baris yang ingin kami sembunyikan menjadi 0 jika kami menggunakan UITableView yang dikelompokkan karena batas tidak akan dapat digambarkan dengan benar.
sumber
NSMutableSet
untukhiddenSections
gantinya. Ini jauh lebih cepat karena Anda kebanyakan menguji keanggotaan.NSMutableSet
untukhiddenSections
, meskipun saya mengerti bahwa titik jawaban Anda lebih konseptual daripada rewel tentang jenis struktur data yang harus Anda gunakan.Ternyata, Anda dapat menyembunyikan dan menampilkan sel dalam UITableView statis - dan dengan animasi. Dan itu tidak terlalu sulit untuk dicapai.
Proyek demo
Video proyek demo
Intinya:
Use tableView:heightForRowAtIndexPath:
untuk menentukan ketinggian sel secara dinamis berdasarkan pada beberapa keadaan.tableView.beginUpdates();tableView.endUpdates()
tableView.cellForRowAtIndexPath:
dalamtableView:heightForRowAtIndexPath:
. Gunakan indexPath yang di-cache untuk membedakan sel.Info lebih lanjut di blog saya (bahasa Rusia)
sumber
Ya, itu pasti mungkin, meskipun saya sedang berjuang dengan masalah yang sama saat ini. Saya telah berhasil membuat sel-selnya disembunyikan dan semuanya berfungsi dengan baik, tetapi saat ini saya tidak dapat membuat benda itu hidup dengan rapi. Inilah yang saya temukan:
Saya menyembunyikan baris berdasarkan status sakelar HIDUP / MATI di baris pertama bagian pertama. Jika sakelar HIDUP ada 1 baris di bawahnya di bagian yang sama, jika tidak ada 2 baris yang berbeda.
Saya memiliki pemilih yang dipanggil saat sakelar diaktifkan, dan saya menetapkan variabel untuk menunjukkan keadaan saya saat ini. Lalu saya menelepon:
Saya mengganti fungsi tableView: willDisplayCell: forRowAtIndexPath: dan jika sel seharusnya disembunyikan saya melakukan ini:
Itu menyembunyikan sel dan isinya, tetapi tidak menghilangkan ruang yang didudukinya.
Untuk menghapus spasi, timpa fungsi tableView: heightForRowAtIndexPath: dan kembalikan 0 untuk baris yang harus disembunyikan.
Anda juga perlu mengganti tableView: numberOfRowsInSection: dan mengembalikan jumlah baris di bagian itu. Anda harus melakukan sesuatu yang aneh di sini sehingga jika meja Anda adalah gaya yang dikelompokkan sudut-sudut bulat terjadi pada sel yang benar. Dalam tabel statis saya ada set lengkap sel untuk bagian tersebut, jadi ada sel pertama yang berisi opsi, lalu 1 sel untuk opsi status ON dan 2 sel lagi untuk opsi status MATI, total 4 sel. Ketika opsi ON, saya harus mengembalikan 4, ini termasuk opsi tersembunyi sehingga opsi terakhir yang ditampilkan memiliki kotak bulat. Ketika opsi mati, dua opsi terakhir tidak ditampilkan jadi saya kembali 2. Ini semua terasa kikuk. Maaf jika ini tidak terlalu jelas, sulit dijelaskan. Hanya untuk mengilustrasikan pengaturan, ini adalah konstruksi bagian tabel di IB:
Jadi ketika opsi ON tabel melaporkan dua baris yaitu:
Ketika opsi MATI, tabel melaporkan empat baris yaitu:
Pendekatan ini tidak terasa benar karena beberapa alasan, sejauh yang saya dapatkan dengan eksperimen saya sejauh ini, jadi tolong beri tahu saya jika Anda menemukan cara yang lebih baik. Masalah yang saya amati sejauh ini adalah:
Rasanya salah mengatakan tabel jumlah baris berbeda dengan apa yang mungkin terkandung dalam data yang mendasarinya.
Sepertinya saya tidak bisa menghidupkan perubahan. Saya sudah mencoba menggunakan tableView: reloadSections: withRowAnimation: alih-alih reloadData dan hasilnya sepertinya tidak masuk akal, saya masih mencoba membuatnya berfungsi. Saat ini yang tampaknya terjadi adalah tableView tidak memperbarui baris yang benar sehingga satu tetap tersembunyi yang harus ditampilkan dan kekosongan ditinggalkan di bawah baris pertama. Saya pikir ini mungkin terkait dengan poin pertama tentang data yang mendasarinya.
Semoga seseorang akan dapat menyarankan metode alternatif atau mungkin cara memperluas dengan animasi, tetapi mungkin ini akan membantu Anda memulai. Saya minta maaf karena kurangnya hyperlink ke fungsi, saya masukkan tetapi mereka ditolak oleh filter spam karena saya adalah pengguna yang cukup baru.
sumber
[[self tableView] reloadData];
sekali lagi setelah menyembunyikan selreturn [super tableView:tableView cellForRowAtIndexPath:indexPath];
diUITableViewController
subclass untuk menciptakan sel statis. Jalur indeks diindeks statis - tidak dinamis ...Sesuai jawaban Justas, tetapi untuk Swift 4:
sumber
tableView.reloadRows(at:, with:)
memperbarui sel jika Anda mengubah ketinggian saat baris sudah terlihat.Oke, setelah mencoba, saya punya jawaban yang tidak umum. Saya menggunakan variabel "isHidden" atau "hidden" untuk memeriksa apakah sel ini harus disembunyikan.
buat IBOutlet ke pengontrol tampilan Anda.
@IBOutlet weak var myCell: UITableViewCell!
Perbarui
myCell
fungsi kustom Anda, misalnya Anda dapat menambahkannya di viewDidLoad:override func viewDidLoad() { super.viewDidLoad() self.myCell.isHidden = true }
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let cell = super.tableView(tableView, cellForRowAt: indexPath) guard !cell.isHidden else { return 0 } return super.tableView(tableView, heightForRowAt: indexPath) }
Ini akan mengurangi logika Anda dalam metode delegasi, dan Anda hanya perlu fokus pada kebutuhan bisnis Anda.
sumber
Jawaban di atas yang menyembunyikan / menampilkan sel, mengubah rowHeight, atau mengacaukan dengan batasan tata letak otomatis tidak berfungsi untuk saya karena masalah tata letak otomatis. Kode menjadi tidak tertahankan.
Untuk tabel statis sederhana, yang paling berhasil bagi saya adalah:
Ini adalah contoh dari pengontrol tampilan tabel saya:
sumber
Metode Kompatibel iOS 11 & IB / Storyboard Sederhana
Untuk iOS 11, saya menemukan bahwa versi modifikasi dari jawaban Mohamed Saleh bekerja paling baik, dengan beberapa perbaikan berdasarkan dokumentasi Apple. Ia menjiwai dengan baik, menghindari peretasan yang jelek atau nilai yang di-hardcoded, dan menggunakan ketinggian baris yang telah ditetapkan dalam Interface Builder .
Konsep dasarnya adalah mengatur tinggi baris ke 0 untuk setiap baris tersembunyi. Kemudian gunakan
tableView.performBatchUpdates
untuk memicu animasi yang bekerja secara konsisten.Atur ketinggian sel
Anda akan ingin memastikan
cellIsHidden
danindexPathOfHiddenCell
diatur sesuai dengan kasus penggunaan Anda. Untuk kode saya mereka adalah properti pada pengontrol tampilan tabel saya.Beralih sel
Dalam metode apa pun yang mengontrol visibilitas (kemungkinan aksi tombol atau
didSelectRow
), alihkan keadaan cellIsHidden, di dalamperformBatchUpdates
blok:Apple merekomendasikan
performBatchUpdates
lebih daribeginUpdates
/endUpdates
kapan pun memungkinkan.sumber
Saya menemukan solusi untuk menghidupkan sel bersembunyi di tabel statis.
Hanya satu kamus tambahan yang dibutuhkan:
Dan lihat implementasi MyTableViewController. Kami membutuhkan dua metode untuk mengonversi indexPath antara indeks yang terlihat dan tidak terlihat ...
Satu IBAction pada perubahan nilai UISwitch:
Beberapa metode UITableViewDataSource dan UITableViewDelegate:
sumber
Jawab dengan cepat :
Tambahkan metode berikut di TableViewController Anda:
jika tableView mencoba menggambar sel yang ingin Anda sembunyikan, maka ia tidak akan menampilkannya karena tingginya akan diatur ke 0pt berkat metode di atas, semua yang lain tetap tidak berubah.
Harap dicatat bahwa
indexPathOfCellYouWantToHide
dapat diubah kapan saja :)sumber
Di> Swift 2.2, saya telah menggabungkan beberapa jawaban di sini.
Buat saluran keluar dari storyboard untuk menautkan ke staticCell Anda.
Saya ingin menyembunyikan sel pertama saya sehingga saya mengatur ketinggian ke 0 seperti dijelaskan di atas.
sumber
Swift 4:
sumber
Untuk skenario termudah ketika Anda menyembunyikan sel di bagian paling bawah tampilan tabel, Anda bisa menyesuaikan contentInset tableView setelah Anda menyembunyikan sel:
sumber
Ini adalah cara baru untuk melakukan ini menggunakan https://github.com/k06a/ABStaticTableViewController
sumber
Solusi dari k06a ( https://github.com/k06a/ABStaticTableViewController ) lebih baik karena menyembunyikan seluruh bagian termasuk header dan footer sel, di mana solusi ini ( https://github.com/peterpaulis/StaticDataTableViewController ) menyembunyikan semuanya kecuali footer.
EDIT
Saya baru saja menemukan solusi jika Anda ingin menyembunyikan catatan kaki
StaticDataTableViewController
. Ini yang perlu Anda salin dalam file StaticTableViewController.m:sumber
Tentunya kamu bisa. Pertama, kembalilah ke tableView Anda jumlah sel yang ingin Anda tampilkan lalu panggil
super
untuk mencapai sel tertentu dari storyboard Anda dan kembalikan untuk tableView:Jika sel Anda memiliki hieght yang berbeda, kembalikan juga:
sumber
Selain solusi @Saleh Masum:
Jika Anda mendapatkan kesalahan tata letak otomatis , Anda bisa menghapus batasan dari
tableViewCell.contentView
Swift 3:
Solusi ini tergantung pada aliran aplikasi Anda . Jika Anda ingin menampilkan / menyembunyikan sel dalam instance controller tampilan yang sama, ini mungkin bukan pilihan terbaik, karena menghilangkan kendala .
sumber
Saya mendapatkan cara yang lebih baik untuk menyembunyikan sel statis dan bahkan bagian secara dinamis tanpa ada peretasan.
Mengatur tinggi baris ke 0 dapat menyembunyikan baris, tetapi itu tidak berfungsi jika Anda ingin menyembunyikan seluruh bagian yang akan menampung beberapa spasi bahkan Anda menyembunyikan semua baris.
Pendekatan saya adalah untuk membangun bagian array sel statis. Maka isi tampilan tabel akan didorong oleh array bagian.
Berikut ini beberapa contoh kode:
Dengan cara ini, Anda dapat menyatukan semua kode konfigurasi tanpa harus menulis kode jahat untuk menghitung jumlah baris dan bagian. Dan tentu saja tidak
0
ketinggian lagi.Kode ini juga sangat mudah dipelihara. Misalnya, jika Anda ingin menambah / menghapus lebih banyak sel atau bagian.
Demikian pula, Anda dapat membuat larik judul tajuk bagian dan larik judul tajuk bagian untuk mengonfigurasi judul bagian Anda secara dinamis.
sumber