Saya memiliki UITableViewCell
yang terkait dengan suatu objek dan saya perlu mengetahui apakah sel tersebut terlihat. Dari penelitian yang telah saya lakukan, ini berarti saya perlu mengakses UITableView
yang berisi itu (dari sana, ada beberapa cara untuk memeriksa apakah itu terlihat). Jadi saya bertanya-tanya apakah UITableViewCell
memiliki pointer ke UITableView
, atau apakah ada cara lain untuk mendapatkan pointer dari sel?
100
[cell superView]
mungkin?Jawaban:
Untuk menghindari memeriksa versi iOS, jalankan superview secara berulang dari tampilan sel sampai UITableView ditemukan:
sumber
@property (weak, nonatomic) UITableView *tableView;
dan ditableView:cellForRowAtIndexPath:
set sajacell.tableView = tableView;
.Di iOS7 beta 5
UITableViewWrapperView
adalah tampilan super dari aUITableViewCell
. JugaUITableView
superview dari aUITableViewWrapperView
.Jadi untuk iOS 7 solusinya adalah
UITableView *tableView = (UITableView *)cell.superview.superview;
Jadi untuk iOS hingga iOS 6 solusinya adalah
UITableView *tableView = (UITableView *)cell.superview;
sumber
UITableViewCell
kategori dengan metode baru,relatedTableView
yang memeriksa versi iOS dan mengembalikan superView yang sesuai.Ekstensi Swift 5
Secara rekursif
Menggunakan loop
sumber
view != nil
pemeriksaan sebelum membuka bungkusnya . Diperbarui ke kode pembersihSebelum iOS7, tampilan super sel adalah
UITableView
yang berisi itu. Pada GM iOS7 (jadi mungkin akan dirilis ke publik juga) tampilan super sel adalahUITableViewWrapperView
dengan tampilan supernya menjadiUITableView
. Ada dua solusi untuk masalah ini.Solusi # 1: Buat
UITableViewCell
kategoriIni adalah pengganti drop-in yang baik untuk digunakan
cell.superview
, membuatnya mudah untuk memfaktorkan ulang kode yang ada - cukup telusuri dan ganti dengan[cell relatedTable]
, dan berikan pernyataan untuk memastikan bahwa jika hierarki tampilan berubah atau kembali di masa mendatang, maka akan segera muncul dalam ujianmu.Solusi # 2: Tambahkan
UITableView
referensi Lemah keUITableViewCell
Ini adalah desain yang jauh lebih baik, meskipun akan membutuhkan lebih banyak pemfaktoran ulang kode untuk digunakan dalam proyek yang sudah ada. Dalam
tableView:cellForRowAtIndexPath
penggunaan SOUITableViewCell sebagai kelas sel Anda atau pastikan kelas sel khusus Anda disubkelas dariSOUITableViewCell
dan tetapkan tableView ke properti tableView sel. Di dalam sel, Anda kemudian dapat merujuk ke tampilan tabel yang berisi menggunakanself.tableView
.sumber
[self.superview.superview isKindOfClass:[UITableView class]]
harus menjadi yang pertama, karena iOS 7 semakin banyak.Jika terlihat maka itu memiliki superview. Dan ... kejutan ... superview adalah objek UITableView.
Namun, memiliki tampilan super bukanlah jaminan untuk tampil di layar. Tetapi UITableView menyediakan metode untuk menentukan sel mana yang terlihat.
Dan tidak, tidak ada referensi khusus dari sel ke tabel. Tetapi ketika Anda membuat subkelas UITableViewCell, Anda dapat memperkenalkan dan menyetelnya saat pembuatan. (Saya sering melakukannya sendiri sebelum memikirkan hierarki subview.)
Pembaruan untuk iOS7: Apple telah mengubah hierarki subview di sini. Seperti biasa ketika mengerjakan hal-hal yang tidak terdokumentasi dengan rinci, selalu ada risiko hal-hal tersebut berubah. Jauh lebih hemat untuk "merayapi" hierarki tampilan hingga objek UITableView akhirnya ditemukan.
sumber
Solusi cepat 2.2.
Ekstensi untuk UIView yang secara rekursif mencari tampilan dengan tipe tertentu.
atau lebih ringkas (berkat kabiroberai):
Di sel Anda, Anda hanya menyebutnya:
Perhatikan bahwa UITableViewCell ditambahkan di UITableView hanya setelah eksekusi cellForRowAtIndexPath.
sumber
lookForSuperviewOfType:
metode bodi menjadi satu baris, membuatnya lebih cepat:return superview as? T ?? superview?.superviewOfType(type)
Apa pun yang akhirnya Anda lakukan dengan memanggil tampilan super atau melalui rantai penjawab akan menjadi sangat rapuh. Cara terbaik untuk melakukan ini, jika sel ingin mengetahui sesuatu, adalah dengan mengirimkan objek ke sel yang merespons beberapa metode yang menjawab pertanyaan yang ingin ditanyakan sel, dan meminta pengontrol menerapkan logika untuk menentukan apa yang harus dijawab. (dari pertanyaan Anda, saya kira sel ingin tahu apakah ada sesuatu yang terlihat atau tidak).
Buat protokol delegasi dalam sel, setel delegasi sel tableViewController dan pindahkan semua logika "pengontrol" ui di tableViewCotroller.
Sel tampilan tabel harus berupa tampilan dum yang hanya akan menampilkan informasi.
sumber
Saya membuat kategori di UITableViewCell untuk mendapatkan tableView induknya:
Terbaik,
sumber
Berikut adalah versi Swift berdasarkan jawaban di atas. Saya telah menggeneralisasi
ExtendedCell
untuk penggunaan nanti.Semoga bantuan ini :)
sumber
Saya mendasarkan solusi ini pada saran Gabe bahwa
UITableViewWrapperView
objek adalah tampilan superUITableViewCell
objek di iOS7 beta5.Subkelas
UITableviewCell
:sumber
Saya meminjam dan memodifikasi sedikit dari jawaban di atas dan menghasilkan cuplikan berikut.
Meneruskan di kelas menawarkan fleksibilitas untuk melintasi dan mendapatkan tampilan selain UITableView di beberapa kesempatan lain.
sumber
Solusi saya untuk masalah ini agak mirip dengan solusi lain, tetapi menggunakan loop-for yang elegan dan pendek. Ini juga harus tahan masa depan:
sumber
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
sumber
Daripada superview, coba gunakan ["UItableViewvariable" visibleCells].
Saya menggunakannya di foreach loop untuk melakukan loop melalui sel yang dilihat aplikasi dan berhasil.
Bekerja seperti pesona.
sumber
Diuji minimal tetapi contoh Swift 3 non-umum ini tampaknya berfungsi:
sumber
kode ini
`UITableView *tblView=[cell superview];
akan memberi Anda contoh UItableview yang berisi sel tampilan tabesumber
Saya sarankan Anda melintasi hierarki tampilan dengan cara ini untuk menemukan induk UITableView:
Jika tidak, kode Anda akan rusak ketika Apple mengubah hierarki tampilan lagi .
Jawaban lain yang juga melintasi hierarki adalah rekursif.
sumber
http://www.curiousfind.com/blog/646 Terima kasih
sumber
Anda bisa mendapatkannya dengan satu baris kode.
sumber
sumber
dari jawaban @idris saya menulis perluasan untuk UITableViewCell di Swift
sumber