Bisa seseorang memberitahu saya cara untuk melakukan UITableView
diupgrade / animasi dilipat di sections
dari UITableView
seperti di bawah ini?
atau
ios
iphone
uitableview
object
vinnitu
sumber
sumber
Jawaban:
Anda harus membuat baris tajuk sendiri dan meletakkannya sebagai baris pertama di setiap bagian. Subclass
UITableView
atau header yang sudah ada akan merepotkan. Berdasarkan cara mereka bekerja sekarang, saya tidak yakin Anda dapat dengan mudah mengambil tindakan dari mereka. Anda dapat mengatur sel untuk TERLIHAT seperti header, dan mengaturtableView:didSelectRowAtIndexPath
untuk memperluas atau menciutkan bagiannya secara manual.Saya akan menyimpan array boolean sesuai dengan nilai "yang dikeluarkan" dari setiap bagian Anda. Kemudian Anda dapat mengaktifkan
tableView:didSelectRowAtIndexPath
di setiap baris tajuk kustom Anda untuk mengubah nilai ini dan kemudian memuat ulang bagian tertentu itu.Kemudian setel
numberOfRowsInSection
untuk memeriksamybooleans
nilai dan mengembalikan 1 jika bagian tidak diperluas, atau 1+ jumlah item di bagian jika diperluas.Selain itu, Anda perlu memperbarui
cellForRowAtIndexPath
untuk mengembalikan sel header khusus untuk baris pertama di bagian mana pun.sumber
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
adalah cara yang lebih baik untuk menyediakan "tajuk ubahsuaian" Anda, karena memang itulah yang dirancang untuk dilakukan.Beberapa kode contoh untuk menganimasikan tindakan perluas / ciutkan menggunakan header bagian tampilan tabel disediakan oleh Apple di sini: Animasi dan Gerakan Tampilan Tabel
Kunci dari pendekatan ini adalah untuk mengimplementasikan
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
dan mengembalikan UIView kustom yang menyertakan tombol (biasanya berukuran sama dengan tampilan header itu sendiri). Dengan membuat subclass UIView dan menggunakannya untuk tampilan header (seperti yang dilakukan sampel ini), Anda dapat dengan mudah menyimpan data tambahan seperti nomor bagian.sumber
dequeueReusableHeaderFooterViewWithIdentifier
) - klik panah itu dan gulir kembali ke permainan pertama dan coba tutup -> NSInternalInconsistencyException (iOS 8.4 / iPhone 5s)Saya mendapat solusi bagus yang terinspirasi oleh Animasi dan Gerakan Tampilan Tabel Apple . Saya menghapus bagian yang tidak perlu dari sampel Apple dan menerjemahkannya dengan cepat.
Saya tahu jawabannya cukup panjang, tetapi semua kode itu diperlukan. Untungnya, Anda dapat menyalin & melewati sebagian besar kode dan hanya perlu melakukan sedikit modifikasi pada langkah 1 dan 3
1. buat
SectionHeaderView.swift
danSectionHeaderView.xib
yang
SectionHeaderView.xib
(tampilan dengan latar belakang abu-abu) harus terlihat seperti ini di tableview (Anda dapat menyesuaikan sesuai dengan kebutuhan Anda, tentu saja):catatan:
a)
toggleOpen
tindakan tersebut harus ditautkandisclosureButton
b)
disclosureButton
dantoggleOpen
tindakan tidak perlu. Anda dapat menghapus 2 hal ini jika Anda tidak membutuhkan tombolnya.2. buat
SectionInfo.swift
3. dalam tampilan tabel Anda
sumber
Untuk mengimplementasikan bagian tabel yang dapat diciutkan di iOS, keajaibannya adalah bagaimana mengontrol jumlah baris untuk setiap bagian, atau kita dapat mengatur ketinggian baris untuk setiap bagian.
Selain itu, kita perlu menyesuaikan header bagian sehingga kita dapat mendengarkan acara tap dari area header (apakah itu tombol atau keseluruhan header).
Bagaimana cara menangani header? Ini sangat sederhana, kami memperluas kelas UITableViewCell dan membuat sel header kustom seperti:
lalu gunakan viewForHeaderInSection untuk menghubungkan sel header:
ingat kita harus mengembalikan contentView karena fungsi ini mengharapkan UIView dikembalikan.
Sekarang mari kita berurusan dengan bagian yang bisa dilipat, berikut adalah fungsi sakelar yang mengalihkan prop yang bisa diciutkan dari setiap bagian:
tergantung pada bagaimana Anda mengelola data bagian, dalam hal ini, saya memiliki data bagian seperti ini:
pada akhirnya, yang perlu kita lakukan adalah berdasarkan pada prop yang dapat diciutkan dari setiap bagian, kendalikan jumlah baris dari bagian itu:
Saya memiliki demo yang berfungsi penuh di Github saya: https://github.com/jeantimex/ios-swift-collapsible-table-section
Jika Anda ingin menerapkan bagian yang dapat diciutkan dalam tabel gaya yang dikelompokkan, saya memiliki demo lain dengan kode sumber di sini: https://github.com/jeantimex/ios-swift-collapsible-table-section-in-grouped-section
Semoga membantu.
sumber
Saya memiliki solusi yang lebih baik bahwa Anda harus menambahkan UIButton ke header bagian dan mengatur ukuran tombol ini sama dengan ukuran bagian, tetapi membuatnya tersembunyi dengan warna latar belakang yang jelas, setelah itu Anda dengan mudah memeriksa bagian mana yang diklik untuk memperluas atau menutup
sumber
tableView:numberOfRowsInSection:
akan tersentuh dan Anda akan terus dapat menggunakannya untuk maksud sebenarnya. Hal yang sama berlaku untuktableView:cellForRowAtIndexPath:
.UITableViewHeaderFooterView
dan menambahkansection
properti dan mendefinisikan aSectionHeaderViewDelegate
yang menyediakan callback untuk membuka / menutup bagian tersebut. ( developer.apple.com/library/ios/samplecode/TableViewUpdates/… )Saya akhirnya hanya membuat headerView yang berisi tombol (saya melihat solusi Son Nguyen di atas setelah fakta, tetapi inilah kode saya .. sepertinya banyak tetapi cukup sederhana):
menyatakan beberapa bools untuk Anda bagian
...kode
sekarang dalam metode delegasi tableview Anda ...
dan terakhir fungsi yang dipanggil saat Anda menyentuh salah satu tombol tajuk bagian:
sumber
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
dalam metode collapse / uncollapse, itu harus dianimasikan dengan baik.Ini adalah cara terbaik yang saya temukan untuk membuat sel tampilan tabel yang dapat diperluas
file .h
file .m
Metode delegasi tampilan tabel
sumber
Jadi, berdasarkan solusi 'tombol di header', berikut adalah implementasi yang bersih dan minimalis:
Ini kodenya:
sumber
Saya menemukan cara lain yang relatif sederhana untuk memecahkan masalah itu. Dengan menggunakan metode ini kita tidak perlu mengubah cell kita yang hampir selalu berhubungan dengan indeks data array, yang berpotensi menyebabkan kekacauan pada pengontrol tampilan kita.
Pertama, kami menambahkan properti berikut ini ke kelas pengontrol kami:
collapsedSections
akan menyimpan nomor bagian yang diciutkan.sectionViews
akan menyimpan tampilan bagian kustom kami.Mensintesisnya:
Inisialisasi:
Setelah itu, kita harus menghubungkan UITableView kita sehingga dapat diakses dari dalam kelas pengontrol tampilan kita:
Hubungkan dari XIB untuk melihat pengontrol menggunakan
ctrl + drag
seperti biasanya.Kemudian kami membuat tampilan sebagai header bagian kustom untuk tampilan tabel kami dengan menerapkan delegasi UITableView ini:
Selanjutnya, kami menerapkan metode untuk menyimpan tajuk bagian khusus yang kami buat sebelumnya di properti kelas:
Tambahkan
UIGestureRecognizerDelegate
ke file .h pengontrol tampilan kami:Kemudian kami membuat metode
attachTapGestureToView:
Metode di atas akan menambahkan pengenal gerakan tap ke semua tampilan bagian yang kita buat sebelumnya. Selanjutnya kita harus menerapkan
onTap:
selectorMetode di atas akan dipanggil ketika pengguna mengetuk salah satu bagian tampilan tabel kami. Metode ini mencari nomor bagian yang benar berdasarkan
sectionViews
array yang kita buat sebelumnya.Selain itu, kami menerapkan metode untuk mendapatkan bagian dari tampilan header milik.
Selanjutnya, kita harus menerapkan metode
toggleCollapseSection:
Metode ini akan memasukkan / menghapus nomor bagian ke
collapsedSections
array yang kita buat sebelumnya. Ketika nomor bagian disisipkan ke larik itu, itu berarti bagian tersebut harus diciutkan dan diperluas jika sebaliknya.Selanjutnya kami menerapkan
removeCollapsedSection:
,addCollapsedSection:section
danisCollapsedSection:section
Ketiga metode ini hanya membantu memudahkan kita dalam mengakses
collapsedSections
array.Terakhir, terapkan delegasi tampilan tabel ini sehingga tampilan bagian kustom kita terlihat bagus.
Semoga membantu.
sumber
Saya telah menggunakan NSDictionary sebagai sumber data, ini terlihat seperti banyak kode, tetapi sangat sederhana dan berfungsi dengan sangat baik! bagaimana tampilannya di sini
Saya membuat enum untuk bagian tersebut
properti bagian:
Sebuah metode mengembalikan bagian saya:
Dan kemudian atur data saya:
Metode selanjutnya, akan membantu Anda mengetahui kapan suatu bagian dibuka, dan cara merespons sumber data tableview:
Tanggapi bagian untuk sumber data:
Alat:
Alihkan visibilitas bagian
sumber
// vKj
sumber
// vKj
sumber
Memperluas pada ini jawaban tertulis di Objective C, saya menulis sebagai berikut bagi mereka menulis di Swift
Idenya adalah menggunakan bagian dalam tabel dan mengatur jumlah baris di bagian menjadi 1 (diciutkan) dan 3 (diperluas) saat baris pertama di bagian tersebut diketuk
Tabel memutuskan berapa banyak baris yang akan digambar berdasarkan larik nilai Boolean
Anda harus membuat dua baris di storyboard dan memberi mereka pengenal yang dapat digunakan kembali 'CollapsingRow' dan 'GroupHeading'
sumber
Beberapa kode contoh untuk menganimasikan tindakan perluas / ciutkan menggunakan header bagian tampilan tabel disediakan oleh Apple di Animasi dan Gerakan Tampilan Tabel .
Kunci dari pendekatan ini adalah menerapkan
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
dan mengembalikan UIView khusus yang menyertakan tombol (biasanya berukuran sama dengan tampilan header itu sendiri). Dengan membuat subclass UIView dan menggunakannya untuk tampilan header (seperti yang dilakukan contoh ini), Anda dapat dengan mudah menyimpan data tambahan seperti nomor bagian.
sumber
Saya telah melakukan hal yang sama menggunakan beberapa bagian.
sumber
Saya menambahkan solusi ini untuk kelengkapan dan menunjukkan cara bekerja dengan header bagian.
Tautan ke inti: https://gist.github.com/pawelkijowskizimperium/fe1e8511a7932a0d40486a2669316d2c
sumber
untuk mendukung solusi @ jean.timex, gunakan kode di bawah ini jika Anda ingin membuka satu bagian kapan saja. buat variabel seperti: var diperluasSection = -1;
sumber