Saya memiliki pengontrol tampilan dengan tampilan tabel dan pena terpisah untuk templat sel tabel. Templat sel memiliki beberapa tombol. Saya ingin mengakses klik tombol bersama dengan indeks sel yang diklik di dalam view controller di mana saya telah mendefinisikan tampilan Table.
Jadi saya memiliki ViewController.h
dan di ViewController.m
mana saya memiliki UITableView
dan TableTemplate.h
, TableTemplate.m
dan di TableTemplate.xib
mana saya memiliki biji didefinisikan. Saya ingin acara klik tombol dengan indeks sel di ViewController.m
.
Ada bantuan tentang bagaimana saya bisa melakukan itu?
sumber
Delegasi adalah cara untuk pergi.
Seperti yang terlihat dengan jawaban lain menggunakan tampilan mungkin sudah ketinggalan zaman. Siapa tahu besok mungkin ada bungkus lain dan mungkin perlu digunakan
cell superview]superview]superview]superview]
. Dan jika Anda menggunakan tag, Anda akan mendapatkan nomor n jika kondisi lain untuk mengidentifikasi sel. Untuk menghindari semua itu mengatur delegasi. (Dengan melakukan itu, Anda akan membuat kelas sel yang dapat digunakan kembali. Anda bisa menggunakan kelas sel yang sama dengan kelas dasar dan yang harus Anda lakukan hanyalah menerapkan metode delegasi.)Pertama kita membutuhkan antarmuka (protokol) yang akan digunakan oleh sel untuk berkomunikasi (mendelegasikan) klik tombol. ( Anda dapat membuat file .h terpisah untuk protokol dan termasuk di dalam pengontrol tampilan tabel dan kelas sel khusus ATAU tambahkan saja di kelas sel kustom yang akan tetap disertakan dalam pengontrol tampilan tabel )
Sertakan protokol ini di pengontrol tampilan sel dan tabel kustom. Dan pastikan pengontrol tampilan tabel mengonfirmasi protokol ini.
Di sel khusus buat dua properti:
Dalam
UIButton
delegasi IBAction, klik: ( Hal yang sama dapat dilakukan untuk tindakan apa pun di kelas sel kustom yang perlu didelegasikan kembali untuk melihat pengontrol )Di pengontrol tampilan tabel
cellForRowAtIndexPath
setelah mengeluarkan sel, atur properti di atas.Dan mengimplementasikan delegate di controller tampilan tabel:
Ini akan menjadi pendekatan yang ideal untuk mendapatkan tindakan tombol sel kustom di pengontrol tampilan tabel.
sumber
Alih-alih bermain dengan tag, saya mengambil pendekatan yang berbeda. Membuat delegasi untuk subclass saya dari UITableViewCell (OptionButtonsCell) dan menambahkan indexPath var. Dari tombol saya di storyboard saya menghubungkan @IBAction ke OptionButtonsCell dan di sana saya mengirim metode delegasi dengan indexPath yang tepat kepada siapa pun yang tertarik. Dalam sel untuk jalur indeks saya mengatur indexPath saat ini dan berfungsi :)
Biarkan kode berbicara sendiri:
Swift 3 Xcode 8
OptionButtonsTableViewCell.swift
MyTableViewController.swift
sumber
class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate
// error: Kesesuaian berlebihan dari 'MyTableViewController' ke protokol 'UITableViewDataSource'Ini akan membantu: -
Di sini pengirim adalah contoh UIButton yang mengirim acara. myTableView adalah instance UITableView yang Anda hadapi.
Dapatkan referensi sel dengan benar dan semua pekerjaan selesai.
Anda mungkin perlu menghapus tombol dari contentView sel & menambahkannya langsung ke instance UITableViewCell karena subview.
Atau
Anda dapat merumuskan skema penamaan tag untuk berbagai UIButtons di cell.contentView. Dengan menggunakan tag ini, nanti Anda bisa mengetahui informasi baris & bagian sesuai kebutuhan.
sumber
Kode berikut mungkin Membantu Anda.
Saya telah mengambil
UITableView
dengan kelas sel prototipe kustom bernamaUITableViewCell
di dalamUIViewController
.Jadi saya punya
ViewController.h
,ViewController.m
danTableViewCell.h
,TableViewCell.m
Ini kode untuk itu:
ViewController.h
ViewController.m
Kelas sel khusus:
dan
Catatan : Di sini saya telah mengambil semua
UIControls
menggunakan Storyboard.Semoga itu bisa membantu Anda ... !!!
sumber
Alasan saya suka teknik di bawah ini karena juga membantu saya untuk mengidentifikasi bagian dari tabel.
Tambahkan Tombol di sel cellForRowAtIndexPath:
AddTask acara:
Berharap bantuan ini.
sumber
Gunakan penutupan Swift:
sumber
Kode Tarun tidak berfungsi di iOS7, karena struktur UITableViewCell berubah dan sekarang ia akan mendapatkan "UITableViewCellScrollView" sebagai gantinya.
Posting ini Mendapatkan UITableViewCell dengan superview di iOS 7 memiliki solusi yang bagus untuk membuat loop untuk menemukan tampilan induk yang benar, terlepas dari perubahan apa pun di masa mendatang dalam struktur. Itu bermuara membuat loop:
Tautan memiliki kode untuk solusi yang lebih dapat digunakan kembali, tetapi ini harus bekerja.
sumber
Cepat 2.2
Anda perlu menambahkan target untuk tombol itu.
FunctionName: terhubung // misalnya
Dan tentu saja Anda perlu mengatur tag tombol itu karena Anda menggunakannya.
Anda dapat mencapai ini dengan mensubclassing UITableViewCell. Gunakan itu di pembangun antarmuka, jatuhkan tombol pada sel itu, hubungkan melalui outlet dan di sana Anda pergi.
Untuk mendapatkan tag di fungsi yang terhubung:
sumber
Swift 3 dengan Penutupan
Solusi yang bagus adalah menggunakan penutupan dalam UITableViewCell kustom untuk memanggil kembali ke viewController untuk suatu tindakan.
Dalam sel:
Dalam View Controller: Delegasi Tableview
sumber
Saya merasa paling mudah untuk mensubclass tombol di dalam sel Anda (Swift 3):
Di kelas sel Anda:
Di sumber data tampilan tabel atau tampilan koleksi, saat mengeluarkan sel, berikan tombol jalur indeksnya:
Jadi Anda bisa memasukkan kode ini ke dalam pengontrol tampilan tabel:
Dan jangan lupa untuk mengatur kelas tombol di Interface Builder Anda dan menautkannya ke
handleTapOnCellInfoButton
fungsi!diedit:
Menggunakan injeksi ketergantungan. Untuk mengatur panggilan penutupan:
dan menyuntikkan penutupan dalam metode willDisplay dari delegasi tampilan koleksi:
sumber
Ini Berfungsi untukku.
sumber
sumber
untuk swift 4:
sumber
Jika Anda ingin meneruskan nilai parameter dari sel ke UIViewController menggunakan closure
sumber
@Mani jawaban baik, namun tag tampilan di dalam contentView sel sering digunakan untuk tujuan lain. Anda dapat menggunakan tag sel sebagai gantinya (atau tag contentView sel):
1) Dalam
cellForRowAtIndexPath:
metode Anda , tetapkan tag sel sebagai indeks:2) Tambahkan target dan aksi untuk tombol Anda seperti di bawah ini:
3) Buat metode yang mengembalikan deretan pengirim (terima kasih @Stenio Ferreira):
4) Tindakan kode berdasarkan indeks:
sumber
CustomTableCell.h adalah UITableViewCell:
MyVC.m setelah impor:
Di dalam "cellForRowAtIndexPath" di MyVC.m:
MyVC.m:
sumber
sumber