Saya memiliki beberapa masalah aneh dengan UITableView
hanya di iOS 7.
UITableViewCellSeparator
menghilang di atas baris pertama dan di bawah baris terakhir. Kadang-kadang setelah memilih baris atau beberapa tindakan bergulir muncul.
Dalam kasus saya tableView
diambil dari Storyboard
dengan UITableViewStylePlain
gaya. Masalahnya pasti tidak ada UITableViewCellSeparatorStyle
, yang tidak diubah dari standar UITableViewCellSeparatorStyleSingleLine
.
Ketika saya membaca di Forum Dev Apple (di sini dan di sini ) orang lain memiliki masalah seperti itu dan beberapa solusi ditemukan, misalnya:
Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.
Tapi saya masih mencari alasan perilaku aneh pemisah seperti itu.
Ada ide?
Pembaruan: Seperti yang saya lihat di XCode 5.1 DP dan iOS 7.1 beta, Apple mencoba untuk memperbaiki masalah ini. Sekarang separator ditampilkan sesuai kebutuhan kadang-kadang di bawah baris terakhir, setelah beberapa refresh, tetapi tidak setelah pembuatan tampilan tabel.
Jawaban:
Saya membuang hierarki subview sel yang terpengaruh dan menemukan bahwa
_UITableViewCellSeparatorView
itu diatur ke tersembunyi. Tidak heran itu tidak ditampilkan!Saya mengesampingkan
layoutSubviews
dalamUITableViewCell
subclass saya dan sekarang separator ditampilkan dengan andal:Tujuan-C :
Cepat :
Solusi lain yang diusulkan di sini tidak bekerja secara konsisten untuk saya atau tampak kikuk (menambahkan tampilan footer kustom 1 px).
sumber
Ini bekerja untuk saya:
sumber
Saya juga punya masalah dengan hilang pemisah dan saya menemukan bahwa masalah hanya terjadi ketika
heightForRowAtIndexPath
itu kembali angka desimal . Larutan:sumber
Apakah Anda mencoba menambahkan UIView dengan tinggi 1 di header dan footer tabel dengan warna latar abu-abu terang? Pada dasarnya itu akan mengolok-olok pemisah pertama dan terakhir.
sumber
@samvermette
Saya memperbaiki masalah dengan menggunakan metode delegasi ini. Sekarang tidak berkedip:
sumber
Kami mengalami masalah ini di aplikasi kami. Ketika pengguna memilih sel, tampilan tabel baru didorong ke tumpukan pengontrol navigasi dan kemudian ketika pengguna muncul itu, pemisah tidak ada. Kami dipecahkan dengan meletakkan
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
dididSelectRowAtIndexPath
metode delegasi tampilan tabel.sumber
self.tableView.allowsMultipleSelection = NO;
?Ini solusi yang lebih mudah (walaupun sedikit berantakan) jika Anda membutuhkannya, coba pilih dan hapus pilihan sel setelah data dimuat ulang dan animasi default selesai.
tambahkan saja:
sumber
Saya telah menemukan bahwa solusi termudah adalah, setelah memuat ulang sel, juga memuat ulang sel di atas:
sumber
Solusi sederhana dan bersih yang bekerja di iOS 8 dan iOS 9 (beta 1)
Ini sederhana, bersih dan tidak mengganggu. Ini melibatkan pemanggilan metode kategori yang akan memperbaiki pemisah.
Yang perlu Anda lakukan adalah berjalan menyusuri hierarki sel dan un-hide pemisah. Seperti ini:
Apa yang saya sarankan adalah menambahkan ini ke kategori di UITableViewCell, seperti ini:
Karena pemisah dapat menghilang dalam sel yang berbeda dari yang dipilih saat ini, mungkin ide yang baik untuk memanggil perbaikan ini pada semua sel dalam tampilan tabel. Untuk itu, Anda dapat menambahkan kategori ke UITableView yang berbunyi seperti ini:
Dengan ini, Anda bisa memanggil
-fixSeparatos
tableView Anda tepat setelah tindakan yang menyebabkan mereka menghilang. Dalam kasus saya, itu setelah menelepon[tableView beginUpdates]
dan[tableView endUpdates]
.Seperti yang saya nyatakan di awal, saya sudah menguji ini di iOS 8 dan iOS 9. Saya kira itu akan bekerja bahkan di iOS 7 tapi saya tidak punya cara untuk mencobanya di sana. Seperti yang mungkin Anda sadari, ini mengotak-atik internal sel sehingga bisa berhenti bekerja di beberapa rilis mendatang. Dan Apple secara teoritis (kemungkinan 0,001%) menolak aplikasi Anda karena hal ini, tetapi saya tidak dapat melihat bagaimana mereka dapat mengetahui apa yang Anda lakukan di sana (memeriksa akhiran suatu kelas tidak dapat dideteksi oleh analis statis sebagai sesuatu buruk, IMO).
sumber
Berdasarkan komentar @ ortwin-gentz, solusi ini cocok untuk saya di iOS 9.
(Tukar Kode)
Saya menggunakan fungsi fixCellsSeparator () setelah memanggil endUpdates () dalam beberapa metode tableView saya, misalnya:
Saya harap solusi ini bermanfaat bagi seseorang!
sumber
Melengkapi jawaban airpaulg.
Jadi pada dasarnya kita harus mengimplementasikan dua metode UITableDelegate. Inilah solusi saya yang berfungsi pada iOS7 dan iOS6.
// Ini akan menyembunyikan grid tabel kosong di bawah sel jika mereka tidak menutupi seluruh layar
sumber
Ini memperbaiki masalah bagi saya:
Pastikan
clipsToBounds
diatur ke YA untuk sel, tetapi TIDAK untuk selcontentView
. Juga diaturcell.contentView.backgroundColor = [UIColor clearColor];
sumber
Sepertinya masalah ini bermanifestasi dalam banyak keadaan.
Bagi saya itu ada hubungannya dengan pemilihan sel. Saya tidak tahu mengapa dan tidak punya waktu untuk menggali terlalu dalam, tetapi saya bisa mengatakan itu mulai terjadi ketika saya mengatur sel
selectionStyle
tidak ada. yaitu:Saya mencoba menggunakan beberapa metode delegasi di atas yang menghidupkan dan mematikan
separatorStyle
propertitableView
tetapi mereka tampaknya tidak melakukan apa pun untuk memperbaiki masalah saya.Seluruh alasan mengapa saya membutuhkannya adalah karena saya bahkan tidak membutuhkan pemilihan sel.
Jadi, saya memang menemukan sesuatu yang bekerja untuk saya. Saya baru saja menonaktifkan pilihan pada
UITableView
:Semoga ini bisa membantu seseorang, jika Anda tidak perlu memilih sel.
sumber
Saya mencoba banyak saran untuk memperbaikinya tetapi tidak dapat memperbaikinya. Akhirnya saya memutuskan untuk membuat garis pemisah seperti di bawah ini:
P / S: kustom di willDisplayCell BUKAN cellForRowAtIndexPath
sumber
Cukup mengejutkan, mengubah
separatorInset
nilai sel bolak-balik tampaknya berfungsi:sumber
Saya juga memiliki masalah tampilan garis pemisah yang tidak konsisten ini di bagian bawah UITableView saya. Menggunakan tampilan footer kustom, saya telah dapat membuat garis yang sama dan menampilkannya di atas potensi yang ada (yang kadang-kadang hilang).
Satu-satunya masalah dari solusi ini adalah bahwa Apple dapat mengubah ketebalan garis suatu hari
sumber
Saya telah memutuskan untuk meletakkan baris kode ini di mana pembaruan tableview terjadi:
Misalnya, dalam kasus saya, saya memasukkannya ke sini:
sumber
Anda perlu menghapus pilihan sel sebelum Anda melakukan pembaruan sel. Maka Anda bisa mengembalikan pilihan.
sumber
Untuk memperbaiki masalah di atas, tambahkan footer kosong di viewDidLoad.
Tolong jangan gunakan baris di atas dalam metode delegasi viewForFooterInSection. Berarti Jangan menerapkan metode viewForFooterInSection.
sumber
untuk memperluas jawaban airpaulg, karena itu tidak sepenuhnya bekerja untuk saya ..
Saya juga harus menerapkan metode heightforfooter untuk mendapatkan ketinggian
kemudian saya perhatikan warna cahaya terlalu gelap. saya memperbaiki ini dengan meraih warna pemisah saat ini dari tampilan tabel dan menggunakannya:
UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];
sumber
Saya juga mengalami masalah ini dalam proyek kami. Tampilan tabel saya memiliki tableFooterView yang dapat membuat ini terjadi. Saya menemukan pemisah di bawah baris terakhir akan muncul jika saya menghapus tableFooterView itu.
sumber
Apa yang membuat perbedaan bagi saya adalah memuat ulang baris yang tidak akan muncul garis pemisah bawah:
sumber
Saya memecahkan masalah ini dengan cara lain: tambahkan layer yang tingginya 0,5px dan warnanya lightgray ke tableview.tableFooterView sebagai sublapisannya.
kodenya seperti ini:
sumber
Di Subclass UITableViewCell Anda, implementasikan layoutSubviews dan tambahkan:
sumber
Seperti orang lain sebutkan, masalah ini tampaknya terwujud dalam berbagai cara. Saya menyelesaikan masalah saya melalui solusi berikut:
sumber
Menjelajahi jawaban dan solusi saya datang dengan pengamatan seperti:
Ini tampaknya bermasalah di iOS 7 dan 8. Saya perhatikan masalah ketika memilih sel dari kode
viewDidLoad
metode jadi:1) solusi melakukannya di
viewDidAppear:
jika seseorang tidak keberatan dengan keterlambatan yang terlihat antara menyajikan tampilan dan memilih sel2) solusi kedua bekerja untuk saya tetapi kode terlihat agak rapuh karena didasarkan pada implementasi internal
UITableViewCell
3) menambahkan pemisah sendiri tampaknya menjadi yang paling fleksibel dan terbaik untuk saat ini tetapi membutuhkan lebih banyak coding :)
sumber
Pengaturan gaya
viewWillAppear
bekerja untuk saya.sumber
Karena ini masih merupakan masalah dengan iOS 8, saya akan menambahkan solusi saya di Swift. Setel garis pemisah tampilan tabel menjadi tidak ada. Kemudian tambahkan kode ini ke metode delegasi cellForRowAtIndexPath. Ini akan menambahkan pemisah yang bagus. Pernyataan if memungkinkan untuk memutuskan sel mana yang harus memiliki pemisah.
sumber
Inilah solusi saya untuk masalah ini. Setelah Anda memasukkan sel Anda, muat ulang bagian itu. Jika memuat ulang seluruh bagian terlalu intensif untuk Anda, cukup muat ulang indexPaths di atas dan di bawah.
sumber
mengalami masalah yang sama, saya menemukan bahwa solusi lain yang baik, terutama jika dataSource Anda tidak besar adalah memuat ulang tableData ketika Anda menerapkan
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
metode ini, berikut ini sebuah contoh:Anda juga dapat memuat ulang data yang tidak terlihat berdasarkan sumber data yang terlihat, tetapi itu membutuhkan beberapa peretasan lagi.
Ingatlah bahwa fungsi delegasi ini termasuk dalam
UITableViewDelegate
protokol!Semoga ini bisa membantu!
sumber