Saya mencoba meneruskan parameter tambahan ke tindakan buttonClicked, tetapi tidak dapat mengetahui sintaks apa yang seharusnya ada di Swift.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Setiap metode buttonClicked saya:
func buttonClicked(sender:UIButton)
{
println("hello")
}
Ada yang punya ide?
Terima kasih atas bantuan Anda.
WARNING TO INTERNET: please check out my answer at the bottom
Jawaban:
Anda tidak dapat meneruskan parameter khusus di
addTarget:
. Satu alternatif adalah mengaturtag
properti tombol dan bekerja berdasarkan tag.Atau untuk Swift 2.2 dan yang lebih baru:
Sekarang lakukan logika berdasarkan
tag
propertisumber
Int
. Tidak ada lagi.Jika Anda ingin mengirim parameter tambahan ke metode buttonClicked, misalnya indexPath atau urlString, Anda dapat membuat subclass UIButton:
Pastikan untuk mengubah kelas tombol di inspektur identitas menjadi subclassedUIButton. Anda dapat mengakses parameter di dalam metode buttonClicked menggunakan
sender.indexPath
atausender.urlString
.Catatan: Jika tombol Anda berada di dalam sel, Anda dapat mengatur nilai parameter tambahan ini dalam metode cellForRowAtIndexPath (tempat tombol dibuat).
sumber
Saya menghargai semua orang yang mengatakan gunakan tag, tetapi Anda benar-benar perlu memperluas kelas UIButton dan cukup menambahkan objek di sana ..
Tag adalah cara putus asa untuk ini. Perpanjang UIButton seperti ini (di Swift 4)
maka panggilan Anda mungkin dipanggil (CATATAN titik dua ":" di
Selector(("webButtonTouched:"))
)lalu akhirnya tangkap semuanya di sini
Anda melakukan ini satu kali dan menggunakannya di seluruh proyek Anda (Anda bahkan dapat membuat kelas anak memiliki "objek" generik dan memasukkan apa pun yang Anda suka ke dalam tombol!). Atau gunakan contoh di atas untuk memasukkan jumlah parameter kunci / string yang tidak ada habisnya ke dalam tombol .. Sangat berguna untuk menyertakan hal-hal seperti url, metodologi konfirmasi pesan, dll.
Selain itu, penting bagi
SO
komunitas untuk menyadari bahwa ada seluruh generasi praktik buruk yang dipotong-potong di internet oleh sejumlah programer yang tidak mengerti / belum diajarkan / melewatkan inti dari konsepobject extensions
sumber
Untuk Swift 3.0 Anda dapat menggunakan berikut ini
sumber
Swift 4.2.0
Hasil:
Di file,
UIButton+Events.swift
saya telah membuat metode ekstensi untukUIButton
itu mengikatUIControl.Event
ke penangan penyelesaian yang disebutEventHandler
:Alasan mengapa saya menggunakan kelas khusus untuk mengikat acara adalah untuk dapat membuang referensi nanti ketika tombol dideintialisasi. Ini akan mencegah kemungkinan kebocoran memori terjadi. Ini tidak mungkin dilakukan dalam
UIButton
ekstensinya, karena saya tidak diizinkan untuk mengimplementasikan properti ataudeinit
metode.sumber
Jika Anda memiliki lingkaran tombol seperti saya, Anda dapat mencoba sesuatu seperti ini
sumber
Kode Swift 4.0 (Ini dia lagi)
Tindakan yang dipanggil harus ditandai seperti ini karena itu adalah sintaks untuk fungsi swift untuk mengekspor fungsi ke bahasa c tujuan.
buat beberapa tombol yang berfungsi:
sumber
Kode Swift 5.0
Saya menggunakan theButton.tag tetapi jika saya memiliki banyak jenis opsi, ini akan menjadi kasus sakelar yang sangat panjang.
.
sumber
Untuk Swift 2.X dan yang lebih baru
sumber
Kode Swift 3.0
Anda dapat mengirim nilai di 'userinfo' dan menggunakannya sebagai parameter dalam fungsi.
sumber
Ini lebih merupakan komentar penting. Berbagi referensi sytanx yang dapat diterima di luar kotak. Untuk solusi peretasan, lihat jawaban lain.
Menurut dokumen Apple, Definisi Metode Tindakan harus salah satu dari ketiganya. Ada lagi yang tidak diterima.
sumber