Di MyClass.m, saya telah mendefinisikan
- (void) myTest: (NSString *) withAString{
NSLog(@"hi, %@", withAString);
}
dan deklarasi yang sesuai di MyClass.h. Kemudian saya ingin menelepon
[self performSelector:@selector(mytest:withAString:) withObject: mystring];
di MyClass.m tapi saya mendapatkan kesalahan yang mirip dengan * Mengakhiri aplikasi karena pengecualian 'NSInvalidArgumentException' yang tidak tertangkap, alasan: '* - [MyClass myTest: withAtring:]: pemilih yang tidak dikenal dikirim ke instance 0xe421f0'
Saya mencoba kasus sederhana dengan pemilih yang tidak mengambil argumen yang mencetak string ke konsol dan itu berfungsi dengan baik. Apa yang salah dengan kode dan bagaimana cara memperbaikinya? Terima kasih.
Jawaban:
Tanda tangan metode Anda adalah:
withAString kebetulan menjadi parameter (namanya menyesatkan, sepertinya itu adalah bagian dari tanda tangan pemilih).
Jika Anda memanggil fungsi dengan cara ini:
Itu akan berhasil.
Tapi, seperti yang disarankan poster lain, Anda mungkin ingin mengganti nama metode:
Dan telepon:
sumber
Di Objective-C, tanda tangan pemilih terdiri dari:
Selektor tidak memiliki pengetahuan tentang:
Berikut ini adalah implementasi kelas di mana metode performMethodsViaSelectors melakukan metode kelas lainnya melalui penyeleksi:
Metode yang Anda inginkan untuk membuat pemilih memiliki input tunggal, jadi Anda akan membuat pemilih untuk itu seperti:
sumber
@Shane Arney
Anda mungkin juga ingin menyebutkan bahwa metode ini hanya untuk melewati maksimum 2 argumen, dan tidak dapat ditunda. (seperti
performSelector:withObject:afterDelay:)
.agak aneh bahwa apel hanya mendukung 2 objek untuk dikirim dan tidak membuatnya lebih umum.
sumber
Kode Anda memiliki dua masalah. Satu diidentifikasi dan dijawab, tetapi yang lainnya tidak. Yang pertama adalah pemilih Anda tidak memiliki nama parameternya. Namun, bahkan ketika Anda memperbaikinya, garis masih akan memunculkan pengecualian, dengan asumsi tanda tangan metode revisi Anda masih mencakup lebih dari satu argumen. Katakanlah metode revisi Anda dinyatakan sebagai:
Membuat penyeleksi untuk metode yang mengambil banyak argumen benar-benar valid (misalnya @selektor (myTestWithString: compareTo :)). Namun, metode performSelector hanya memungkinkan Anda untuk melewatkan satu nilai ke myTest, yang sayangnya memiliki lebih dari satu parameter. Ini akan kesalahan dan memberi tahu Anda bahwa Anda tidak memberikan nilai yang cukup.
Anda selalu dapat mendefinisikan kembali metode Anda untuk mengambil koleksi karena itu hanya parameter:
Namun, ada solusi yang lebih elegan (yang tidak memerlukan refactoring). Jawabannya adalah menggunakan NSInvocation, beserta metodenya
setArgument:atIndex:
daninvoke
.Saya sudah menulis artikel, termasuk contoh kode , jika Anda ingin lebih detail. Fokusnya adalah pada threading, tetapi dasar-dasarnya masih berlaku.
Semoga berhasil!
sumber
Tanda tangan metode Anda tidak masuk akal, apakah Anda yakin itu bukan kesalahan ketik? Saya tidak jelas bagaimana cara kompilasi, meskipun mungkin Anda mendapatkan peringatan yang Anda abaikan?
Berapa banyak parameter yang Anda harapkan dari metode ini?
sumber
Pikirkan kelas harus didefinisikan sebagai:
Anda hanya memiliki satu parameter sehingga Anda hanya memiliki satu:
Anda mungkin ingin mempertimbangkan untuk menggunakan% @ di NSLog Anda juga - ini adalah kebiasaan yang baik untuk masuk - kemudian akan menuliskan objek apa pun - bukan hanya string.
sumber
Dokumen Apple mengatakan tidak ada API yang tersedia untuk fitur ini dan beberapa fitur lain yang diharapkan dalam papan tombol kustom. jadi Anda perlu mencari tahu logika Anda sendiri untuk mengimplementasikan ini.
sumber