Xcode 7.3 baru yang meneruskan parameter melalui addTarget biasanya berfungsi untuk saya, tetapi dalam hal ini memberikan kesalahan pada judul. Ada ide? Itu melempar yang lain ketika saya mencoba mengubahnya menjadi @objc
Terima kasih!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Selektor itu menelepon
func didTapCommentButton(post: Post) {
}
@objc
, atau itu subkelas dariNSObject
?Jawaban:
Dalam kasus saya, fungsi selektor adalah
private
. Setelah saya menghapusprivate
kesalahan itu hilang. Hal yang sama berlaku untukfileprivate
.Di Swift 4
Anda perlu menambahkan
@objc
deklarasi fungsi. Sampai swift 4 ini secara implisit disimpulkan.sumber
fileprivate
.fileprivate
apakah akan terselesaikan?private
tidakfileprivate
akan berhasilAnda perlu menggunakan
@objc
atribut ondidTapCommentButton(_:)
untuk menggunakannya dengan#selector
.Anda mengatakan Anda melakukan itu tetapi Anda mendapat kesalahan lain. Dugaan saya adalah bahwa kesalahan baru itu
Post
bukan tipe yang kompatibel dengan Objective-C. Anda hanya dapat mengekspos metode ke Objective-C jika semua tipe argumennya, dan tipe kembaliannya, kompatibel dengan Objective-C.Anda dapat memperbaikinya dengan membuat
Post
subkelas dariNSObject
, tetapi itu tidak akan menjadi masalah, karena argumen kedidTapCommentButton(_:)
tidak akan menjadi aPost
. Argumen ke fungsi tindakan adalah pengirim tindakan, dan pengirim itu akancommentButton
, yang mungkin aUIButton
. Anda harus menyatakandidTapCommentButton
seperti ini:Anda kemudian akan menghadapi masalah mendapatkan yang
Post
sesuai dengan tombol yang disadap. Ada banyak cara untuk mendapatkannya. Ini dia.Saya mengumpulkan (karena kode Anda mengatakan
cell.commentButton
) bahwa Anda sedang menyiapkan tampilan tabel (atau tampilan koleksi). Dan karena sel Anda memiliki properti non-standar bernamacommentButton
, saya berasumsi bahwa itu adalahUITableViewCell
subkelas khusus . Jadi anggaplah sel AndaPostCell
dinyatakan seperti ini:Kemudian Anda dapat menjalankan hierarki tampilan dari tombol untuk menemukan
PostCell
, dan mendapatkan postingan darinya:sumber
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
Coba buat titik pemilih menunjuk ke fungsi pembungkus, yang pada gilirannya memanggil fungsi delegasi Anda. Itu berhasil untuk saya.
-
sumber
Seperti yang Anda ketahui
selector
[About] mengatakan bahwaObjective-C
runtime harus digunakan. Deklarasi yang ditandai sebagaiprivate
ataufileprivate
tidak diekspos ke runtime Objective-C secara default . Itulah mengapa Anda memiliki dua varian:private
ataufileprivate
deklarasi Anda dengan@objc
[About]internal
,public
,open
akses pengubah [Tentang]sumber