"tidak dikenal pemilih yang dikirim ke instance" kesalahan dalam Objective-C

Saya membuat sebuah tombol dan menambahkan tindakan untuk itu, tapi secepat itu dipanggil, saya punya kesalahan ini:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

Ini kode saya:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}
Mengomentari pertanyaan (1)
Larutan

Sepertinya anda're tidak memori mengelola view controller dengan benar dan sedang deallocated di beberapa titik yang menyebabkan numberButtonClicked: metode yang akan dikirim ke obyek lain yang sekarang menempati memori yang view controller sebelumnya menempati...

Pastikan anda're benar penahan/melepaskan view controller anda.

Komentar (10)

Untuk orang-orang mendapatkan di sini via Google seperti yang saya lakukan, yang mungkin lebih berkaitan dengan Xcode 4.2+/iOS 5+ lagi, apa dengan BUSUR. Saya memiliki kesalahan yang sama "tidak dikenal pemilih yang dikirim ke instance". Dalam kasus saya, saya punya UIButton's target aksi set up untuk lulus itu sendiri sebagai pengirim parameter, tetapi kemudian menyadari bahwa aku didn't membutuhkannya dan yang dihapus dalam kode. Jadi, sesuatu seperti:

- (IBAction)buttonPressed:(UIButton *)sender {

Diubah menjadi:

- (IBAction)buttonPressed {

Mengklik kanan UIButton pada pertanyaan menunjukkan bahwa Menyentuh Dalam acara dikaitkan dengan view controller buttonPressed: metode. Belajar dari posting ini dan pemindahan untuk dimodifikasi metode bekerja yang memperlakukan.

Komentar (13)

Ini adalah top Google jawaban untuk masalah ini, tapi aku memiliki penyebab yang berbeda/hasil - saya pikir saya'd tambahkan di dua sen dalam kasus orang lain tersandung masalah ini.

Aku punya masalah yang sama pagi ini. Saya menemukan bahwa jika anda klik kanan UI item memberikan anda masalah ini, anda dapat melihat sambungan telah dibuat. Dalam kasus saya, saya memiliki sebuah tombol kabel hingga dua tindakan. Saya dihapus tindakan dari menu klik kanan dan rewired mereka dan masalah saya adalah tetap.

Jadi pastikan anda tindakan ini adalah kabel yang tepat.

Komentar (2)

OK, saya harus chip di sini. OP yang dibuat secara dinamis tombol. Aku punya masalah yang sama dan jawabannya (setelah jam berburu) adalah begitu sederhana itu membuat saya sakit.

Bila menggunakan:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

Jika anda menempatkan usus besar pada akhir string - itu akan berlalu pengirim. Jika anda tidak menempatkan usus besar pada akhir dari string itu tidak akan, dan penerima akan mendapatkan pesan kesalahan jika mereka mengharapkan satu. Sangat mudah untuk kehilangan usus besar jika anda secara dinamis menciptakan nama acara.

Penerima kode pilihan tampilan seperti ini:

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

Seperti biasa, selalu jawaban yang jelas itu akan terjawab.

Komentar (3)

Dalam kasus saya, fungsi tidak mengharapkan argumen tapi tombol dikonfigurasi untuk mengirim satu yang menyebabkan kesalahan. Untuk memperbaiki hal ini aku harus rewire event handler.

Berikut ini adalah fungsi saya:

Pemberitahuan ini berisi tidak ada argumen.

Berikut adalah gambar dari tombol saya konfigurasi (klik kanan pada tombol untuk melihat):

Perhatikan ada 3 event handler.

Untuk memperbaiki hal ini aku harus menghapus setiap acara barang-barang karena salah satu dari mereka mengirimkan referensi untuk dirinya sendiri untuk enterPressed fungsi. Untuk menghapus item ini saya mengklik pada ikon x di samping nama dari setiap item sampai tidak ada item yang ditampilkan.

Selanjutnya saya harus kembali tombol untuk acara tersebut. Untuk melakukan hal ini tekan dan tahan tombol Control dan kemudian tarik garis dari tombol aksi. Ini harus mengatakan "Menghubungkan Tindakan". Catatan: saya harus me-restart XCode untuk ini untuk bekerja untuk beberapa alasan; jika tidak, hal ini hanya biarkan aku menyisipkan tindakan (alias membuat tindakan baru) di atas atau di bawah fungsi.

Anda sekarang harus memiliki satu event handler kabel untuk tombol peristiwa yang berlalu tidak ada argumen:

Jawaban ini pujian jawabannya by @Leonard Challis yang harus anda baca juga.

Komentar (1)

Hal ini juga dapat terjadi jika anda don't mengatur "Kelas" dari tampilan interface builder.

Komentar (2)

Dalam kasus saya, saya menggunakan NSNotificationCenter dan mencoba untuk menggunakan selector yang tidak mengambil argumen, tetapi menambahkan usus besar. Menghapus usus besar tetap masalah.

Ketika menggunakan selector nama, don't menggunakan trailing usus besar jika tidak ada argumen. Jika ada's satu argumen, menggunakan satu trailing usus besar. Jika ada lebih dari satu argumen, anda harus nama mereka bersama dengan trailing usus besar untuk masing-masing argumen.

Melihat Adam Rosenfield's jawaban berikut ini: https://stackoverflow.com/questions/738622/selectors-in-objective-c

Komentar (0)

Aku punya masalah ini dengan Cepat proyek di mana saya'm membuat tombol secara dinamis. Masalah kode:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

Solusinya adalah dengan menambahkan full usus besar ':' setelah aksi: mis.

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

Lengkap contoh berikut: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

Komentar (1)

Penyebab paling jelas dari ini (termasuk untuk kelengkapan) adalah tidak benar casting pointer, dan memanggil metode dari kelas yang salah.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
Komentar (1)

Hal ini terjadi pada saya karena tidak sengaja menghapus " @IBAction func... " dalam UIViewcontroller kode kelas, jadi dalam Storyboard dibuat Referensi Outlet, tetapi pada saat runtime ada fungsi untuk proses itu.

Solusinya adalah untuk menghapus Outlet referensi dalam property inspector dan kemudian menciptakan itu menyeret dengan perintah kunci kode kelas.

Semoga membantu!

Komentar (1)

Saya juga punya masalah yang sama.

Saya dihapus saya uibutton pada saya storyboard dan diciptakan itu .. sekarang semuanya bekerja dengan baik.

Komentar (0)

Saya punya masalah yang sama, tapi bagi saya solusi yang sedikit berbeda. Dalam kasus saya, saya menggunakan Kategori untuk memperpanjang kelas yang sudah ada (UIImage untuk beberapa ukuran kapasitas seperti ini howto dalam kasus anda're tertarik) dan lupa untuk tambahkan *.m file untuk membangun target. Bodoh kesalahan, tapi tidak selalu jelas ketika hal itu terjadi di mana untuk melihat. Saya pikir itu's layak pakai...

Komentar (0)

Saya memiliki kesalahan yang sama dan saya menemukan berikut ini:

Ketika anda menggunakan kode

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

Anda mungkin berpikir itu's mencari pemilih:

- (void)yourRefreshMethod{
    (your code here)
}

Tapi itu's benar-benar mencari untuk selector:

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

Bahwa pemilih doesn't ada, sehingga anda mendapatkan kecelakaan.

Anda dapat mengubah selector untuk menerima (id)sender dalam rangka untuk memecahkan kesalahan.

Tetapi bagaimana jika anda memiliki fungsi lain yang memanggil fungsi refresh tanpa menyediakan pengirim? Anda membutuhkan salah satu fungsi yang bekerja untuk keduanya. Solusi yang mudah adalah dengan menambahkan fungsi lain:

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

Dan kemudian memodifikasi refresh pulldown kode untuk menyebut bahwa pemilih bukan:

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

I'm juga melakukan Stanford iOS saja pada yang lebih tua Mac yang dapat't dapat di-upgrade ke versi terbaru dari Mac OSX. Jadi saya'm masih bangunan untuk iOS 6.1, dan ini memecahkan masalah bagi saya.

Komentar (0)

Saya pikir anda harus menggunakan void, bukan IBAction dalam jenis kembali. karena anda tetapkan tombol pemrograman.

Komentar (1)

Pada kasus saya, saya memecahkan masalah setelah 2 jam :

Pengirim (a tabBar item) tidak't memiliki Referensi Outlet. Jadi itu menunjuk kemana-mana.

Juste buat referensi outlet sesuai untuk fungsi anda.

Semoga ini bisa membantu kalian.

Komentar (0)

Solusi lain yang mungkin: Tambahkan '-ObjC' untuk anda linker argumen.

Penjelasan lengkap ada di sini: https://stackoverflow.com/questions/2567498/objective-c-categories-in-static-library/2615407#2615407

Saya pikir intinya adalah: jika kategori yang didefinisikan di perpustakaan anda menghubungkan statis dengan, linker isn't cukup pintar untuk link dalam kategori metode. Bendera di atas membuat linker link di semua objective C kelas dan kategori, tidak hanya orang-orang itu berpikir perlu didasarkan pada analisis sumber anda. (Jangan ragu untuk menyetel atau memperbaiki jawaban itu. I'm tahu terkait bahasa, sehingga saya'm hanya membeo di sini).

Komentar (0)

I'm saat ini pembelajaran pengembangan iOS dan akan melalui "Awal iOS6 Pengembangan" buku oleh aPress. Saya mendapatkan kesalahan yang sama di Bab 10:Storyboard.

Butuh waktu dua hari untuk mencari tahu, tapi aku sengaja mengatur TableView sel's tag untuk 1 ketika seharusnya aku't memiliki. Untuk orang lain mengerjakan buku ini dan menerima kesalahan yang sama, aku harap ini membantu.

Saya benar-benar berharap masa depan kesalahan dalam kode saya lebih mudah untuk menemukan! hahaha. Debug kesalahan tidak melakukan apa pun untuk mendorong saya ke arah yang benar untuk mencari tahu (atau setidaknya saya'm terlalu baru untuk memahami debugger, lol).

Komentar (0)

Dalam kasus saya saya menggunakan UIWebView dan aku melewati sebuah NSString di parameter kedua bukan NSURL. Jadi saya menduga bahwa salah jenis kelas yang dilewatkan ke fungsi-fungsi dapat menyebabkan kesalahan ini.

Komentar (0)

..Dan sekarang saya

Saya memiliki tombol yang terhubung ke metode yang diakses tombol lain's parameter dan yang bekerja bagus TAPI begitu saya mencoba untuk melakukan sesuatu dengan tombol itu sendiri, saya mendapat kecelakaan. Sementara menyusun, tidak ada kesalahan telah ditampilkan.. Solusi?

Aku gagal untuk menghubungkan tombol ke file's pemilik. Jadi jika ada orang di sini adalah sebagai bodoh seperti saya, coba ini :)

Komentar (0)

Namun lain sedikit berbeda solusi/kasus.

Saya menggunakan Xamarin dan MvvmCross dan saya mencoba untuk mengikat UIButton ke ViewModel. Aku punya UIButton kabel ke Stopkontak dan TouchUpInside.

Ketika Mengikat saya hanya menggunakan Outlet:

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

Semua harus saya lakukan adalah menghapus tindakan (TouchUpInside) koneksi di XCode dan yang dipecahkan itu.

P. S. Saya kira ini adalah dasar semua yang berkaitan dengan jawaban sebelumnya dan untuk @Chris Kaminski secara khusus, tapi saya berharap hal ini membantu seseorang...

Sorak-sorai.

Komentar (0)