Saya menggunakan addTarget: action: forControlEvents seperti ini:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
dan saya ingin meneruskan parameter ke pemilih saya "switchToNewsDetails". Satu-satunya hal yang berhasil saya lakukan adalah mengirimkan pengirim (id) dengan menulis:
action:@selector(switchToNewsDetails:)
Tetapi saya mencoba untuk mengirimkan variabel seperti nilai integer. Menulisnya dengan cara ini tidak berhasil:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
Menulisnya dengan cara ini juga tidak berfungsi:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
Bantuan apa pun akan dihargai :)
ios
objective-c
iphone
cocoa-touch
uicontrolevents
Pierre Espenan
sumber
sumber
Jawaban:
Anda tidak meneruskan parameter ke
switchToNewsDetails:
metode di sini. Anda cukup membuat pemilih untuk membuat tombol dapat memanggilnya ketika tindakan tertentu terjadi (sentuh dalam kasing Anda). Kontrol dapat menggunakan 3 jenis penyeleksi untuk merespons tindakan, semuanya memiliki makna parameter yang telah ditentukan sebelumnya:tanpa parameter
dengan 1 parameter yang menunjukkan kontrol yang mengirim pesan
Dengan 2 parameter yang menunjukkan kontrol yang mengirim pesan dan peristiwa yang memicu pesan:
Tidak jelas apa sebenarnya yang Anda coba lakukan, tetapi mengingat Anda ingin menetapkan indeks detail spesifik untuk setiap tombol, Anda dapat melakukan hal berikut:
dalam
switchToNewsDetails:
metode Anda dapat memperoleh indeks itu dan membuka deatails yang sesuai:sumber
[button.layer setValue:yourObject forKey:@"anyKey"];
dan kemudian dalam metode ini, periksa saja(objectClass *)[button.layer valueForKey:@"anyKey"];
Ini seperti versi yang lebih bebas dari.tag
Untuk melewati params khusus bersama dengan tombol klik Anda hanya perlu SUBCLASS UIButton .
(ASR aktif, jadi tidak ada rilis dalam kode.)
Ini myButton.h
Ini myButton.m
Pemakaian:
Fungsi penerima:
Jika Anda membutuhkan saya untuk lebih spesifik pada bagian mana pun dari kode di atas - jangan ragu untuk menanyakannya dalam komentar.
sumber
tag
properti dalam tampilan Android . Mereka dapat menyimpan objek apa pun. Dan Anda juga dapat menyimpan objek dengan kunci seperti di Kamus / Peta.Target-Action memungkinkan tiga bentuk pemilih tindakan yang berbeda:
sumber
Perlu lebih dari sekadar (int) via .tag? Gunakan KVC!
Anda dapat meneruskan data apa pun yang Anda inginkan melalui objek tombol itu sendiri (dengan mengakses CALayers keyValue dict).
Tetapkan target Anda seperti ini (dengan ":")
Tambahkan data Anda ke tombol itu sendiri (baik
.layer
dari tombol yang ada) seperti ini:Kemudian ketika tombol diketuk Anda dapat memeriksanya seperti ini:
sumber
Saya membuat solusi berdasarkan informasi di atas. Saya hanya mengatur titlelabel.text ke string yang ingin saya sampaikan, dan mengatur titlelabel.hidden = YA
Seperti ini :
Dengan cara ini, tidak perlu warisan atau kategori dan tidak ada kebocoran memori
sumber
Saya membuat beberapa tombol untuk setiap nomor telepon dalam array sehingga setiap tombol memerlukan nomor telepon yang berbeda untuk menelepon. Saya menggunakan fungsi setTag karena saya membuat beberapa tombol dalam for loop:
Kemudian dalam panggilan saya: metode yang saya gunakan sama untuk loop dan pernyataan if untuk memilih nomor telepon yang benar:
sumber
- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
Karena ada banyak cara yang disebutkan di sini untuk solusinya, Kecuali fitur kategori.
Misalnya (mis):
di Controller tampilan Anda
Penangan acara:
sumber
Anda dapat mengganti aksi target dengan penutup (blok dalam Objective-C) dengan menambahkan pembungkus penutupan pembantu (ClosureSleeve) dan menambahkannya sebagai objek terkait ke kontrol sehingga tetap dipertahankan. Dengan begitu Anda dapat melewati parameter apa pun.
Cepat 3
Pemakaian:
sumber
self.switchToNewsDetails(parameter: i)
) menembakkan 2 kali, mengapa membantu sayabutton.addAction()
dua kali. Tambahkan breakpoint kebutton.addAction
dan juga pada baris pertama di dalam penutupan dan coba debug sendiri.Ada satu cara lain, di mana Anda bisa mendapatkan indexPath sel tempat tombol Anda ditekan:
menggunakan pemilih tindakan biasa seperti:
dan kemudian di dalam Fungsi Anda:
karena Anda mendapatkan indexPath, itu menjadi jauh lebih simpel.
sumber
Lihat komentar saya di atas, dan saya yakin Anda harus menggunakan NSInvocation ketika ada lebih dari satu parameter
informasi lebih lanjut tentang NSInvocation di sini
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
sumber
Ini memperbaiki masalah saya tetapi macet kecuali saya berubah
untuk
sumber
Saya subkelas UIButton di CustomButton dan saya menambahkan properti tempat saya menyimpan data saya. Jadi saya memanggil metode: (CustomButton *) pengirim dan dalam metode saya hanya membaca data sender.myproperty saya.
Contoh CustomButton:
Metode tindakan:
Tetapkan tindakan
sumber
Jika Anda hanya ingin mengubah teks untukBarButtonItem kiri yang diperlihatkan oleh pengontrol navigasi bersama dengan tampilan baru, Anda dapat mengubah judul tampilan saat ini sebelum memanggil pushViewController ke teks yang diinginkan dan mengembalikannya ke dalam viewHasDisappered callback untuk ditampilkan di lain waktu tampilan saat ini.
Pendekatan ini menjaga fungsionalitas (popViewController) dan tampilan panah yang ditampilkan tetap utuh.
Ini berfungsi untuk kita setidaknya dengan iOS 12, dibangun dengan Xcode 10.1 ...
sumber