Domanda

Ho creato un pulsante e ho aggiunto un'azione, ma non appena è stato richiamato ho ricevuto questo errore:

-[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'

Questo è il mio codice:

- (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(@"---");
}
È stato utile?

Soluzione

Sembra che tu non sei la memoria gestione del controller della vista correttamente e viene deallocata a un certo punto - che fa sì che il metodo numberButtonClicked: da inviare a un altro oggetto che ora occupa la memoria che il controller della vista è stato precedentemente occupava. ..

Assicurarsi che si sta mantenendo correttamente / rilasciare il controller della vista.

Altri suggerimenti

Per quelli che ottengono qui tramite Google come ho fatto io, che probabilmente appartiene più a Xcode 4.2 + / iOS 5+ di più, quello che con ARC. Ho avuto lo stesso errore " selettore non riconosciuto inviato esempio ". Nel mio caso ho avuto l'azione bersaglio di un UIButton impostato in modo da passare se stesso come il parametro del mittente, ma poi capito che non ne avevo bisogno e rimosso che nel codice. Quindi, qualcosa di simile a:

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

è stato cambiato in:

- (IBAction)buttonPressed {

A destra cliccando sul UIButton in questione ha dimostrato che l'evento di tocco Inside è stato associato con i controller di vista buttonPressed: metodo. La rimozione di questo e riassegnazione al metodo modificato funzionava a meraviglia.

Questa è stata la risposta di Google in alto per questo problema, ma ho avuto una diversa causa / effetto - ho pensato di aggiungere nei miei due centesimi nel caso in cui gli altri incappare in questo problema.

Ho avuto un problema simile proprio questa mattina. Ho scoperto che se si fa clic destro l'elemento dell'interfaccia utente che vi offrono il problema, è possibile vedere quali sono stati creati collegamenti. Nel mio caso ho avuto un pulsante cablata fino a due azioni. Ho eliminato le azioni dal menu di scelta rapida e riavvolto e il mio problema è stato risolto.

Quindi assicuratevi di azioni sono cablati in alto a destra.

OK, devo chip in qui. Il PO ha creato in modo dinamico il pulsante . Ho avuto un problema simile e la risposta (dopo ore di caccia) è così semplice mi ha fatto male.

Quando si utilizza:

action:@selector(xxxButtonClick:)

or (as in my case)

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

Se si inserisce un colon, alla fine della stringa - passerà al mittente. Se non si posiziona i due punti alla fine della stringa non sarà così, e il ricevitore sarà possibile ottenere un errore se si aspetta uno. E 'facile perdere i due punti se si sta creando in modo dinamico il nome dell'evento.

Le opzioni di codice ricevitore simile a questa:

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

Come al solito, è sempre la risposta ovvia che viene perso.

Nel mio caso la funzione non si aspettava un argomento, ma il pulsante è stato configurato per inviare quello che causa l'errore. Per risolvere questo problema ho dovuto ricablare il gestore di eventi.

Ecco la mia funzione:

entrare descrizione dell'immagine qui

Si noti non contiene argomenti.

Ecco un'immagine della mia configurazione tasto (tasto destro del mouse sul pulsante per vederlo):

entrare descrizione dell'immagine qui

Avviso ci sono 3 gestori di eventi.

Per risolvere questo ho dovuto togliere ciascuna delle voci degli eventi dal momento che uno di loro è stato l'invio di un riferimento a se stessa alla funzione enterPressed. Per rimuovere questi elementi ho cliccato sul x piccola icona accanto al nome di ogni elemento fino a quando non vi erano elementi visualizzati.

entrare descrizione dell'immagine qui

Poi ho dovuto ricollegare il pulsante per l'evento. Per fare questo tenere premuto il tasto Control e quindi trascinare una linea dal pulsante per l'azione. Si dovrebbe dire "Connetti Azione". Nota: ho dovuto riavviare XCode per questo a lavorare per qualche ragione; altrimenti lasciate solo mi inserisco azioni (aka creare una nuova azione) sopra o sotto la funzione.

entrare descrizione dell'immagine qui

Ora si dovrebbe avere un unico gestore di eventi cablata per l'evento tasto che passa senza argomenti:

entrare descrizione dell'immagine qui

Questa risposta completa la risposta da @Leonard Challis, che si dovrebbe leggere pure.

Questo può succedere anche se non si imposta la "Classe" della vista nel costruttore di interfaccia.

Nel mio caso, stavo usando NSNotificationCenter e ha tentato di utilizzare un selettore che ha avuto alcun argomento, ma è stato l'aggiunta di due punti. Rimozione del colon ha risolto il problema.

Quando si utilizza un nome di selezione, non utilizzare i due punti finali, se non ci sono argomenti. Se c'è un argomento, utilizzare uno due punti finali. Se ci sono più di un argomento, è necessario nome insieme con i due punti finali per ogni argomento.

Si veda la risposta di Adam Rosenfield qui: selettori in Objective-C

Ho avuto questo problema con un progetto Swift dove sto creando i pulsanti in modo dinamico. Codice Problema:

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).")
}

La soluzione era quella di aggiungere due punti completa ':' dopo l'azione:. Per esempio

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).")
    }

Esempio completo qui: https://developer.apple .com / library / content / SampleCode / UICatalog / Listings / Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

La causa più evidente di questo (incluso per completezza) è impropriamente lanciando un puntatore e chiamando un metodo della classe sbagliata.

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

Ho avuto un problema simile, ma per me la soluzione è stata un po 'diversa. Nel mio caso, ho usato una Categoria di estendere una classe esistente (UIImage per alcune funzionalità di ridimensionamento - vedere questo howto nel caso in cui siete interessati) e dimenticato di aggiungere il file * .m al bersaglio build. stupido errore, ma non sempre evidente quando succede dove guardare. Ho pensato che vale la pena condividere ...

ho avuto lo stesso errore e ho scoperto quanto segue:

Quando si utilizza il codice

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

Si può pensare che sta cercando il selettore:

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

Ma in realtà è alla ricerca del selettore:

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

Questo selettore non esiste, in modo da ottenere l'incidente.

È possibile modificare il selettore a ricevere (id) del mittente al fine di risolvere l'errore.

Ma cosa succede se si dispone di altre funzioni che chiamano la funzione di aggiornamento senza che fornisce un mittente? Avete bisogno di una funzione che funziona per entrambi. Facile soluzione è quella di aggiungere un'altra funzione:

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

E quindi modificare il codice di aggiornamento a tendina per chiamare quel selettore invece:

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

Sto anche facendo il corso di Stanford iOS su un vecchio Mac che non può essere aggiornato alla versione più recente di Mac OSX. Così sto ancora costruendo per iOS 6.1, e questo risolto il problema per me.

Ho anche avuto lo stesso problema.

Ho eliminato il mio UIButton nel mio storyboard e ricreato esso .. ora tutto funziona bene.

Questo è accaduto a mia perché accidentalmente cancellare il "@IBAction func ..." dentro il mio codice di classe UIViewController, così nella Storyboard è stato creato l'Outlet di riferimento, ma in fase di esecuzione non vi era alcuna funzione di elaborarlo.

La soluzione era quella di eliminare il riferimento outlet all'interno della finestra di ispezione Proprietà e quindi ricrearlo trascinando con il tasto di comando per il codice della classe.

Speranza che aiuta!

Credo che si dovrebbe usare il vuoto, al posto del IBAction nel tipo di ritorno. perché è stato definito un pulsante di programmazione.

Un'altra possibile soluzione: Aggiungi '-ObjC' ai tuoi argomenti linker

.

spiegazione completa è qui: categorie Objective-C in libreria statica

Credo che il succo è: se la categoria è definito in una libreria si collega in modo statico con, il linker non è abbastanza intelligente per collegare in modalità categoria. La bandiera sopra rende il link linker in tutte le classi C oggettive e categorie, non solo quelli che pensa si ha la necessità di base di analizzare la vostra fonte. (Non esitate a sintonizzarsi o correggere la risposta. Ho saputo che ai linguaggi legati, quindi sto solo ripetendo a pappagallo qui).

Al momento sto imparando sviluppo iOS e passando attraverso la "A partire iOS6 sviluppo" libro di aPremere. Mi è stato sempre lo stesso errore nel capitolo 10:. Storyboard

Mi ci sono voluti due giorni per capirlo, ma ha scoperto per sbaglio ho impostato tag della cella TableView a 1 quando non avrei dovuto. Per chiunque altro a fare questo libro e di ricevere un errore simile Spero che questo aiuta.

Spero davvero che in futuro gli errori nel mio codice sono più facili da trovare! Hahaha. L'errore di debug non ha fatto nulla di spingermi nella direzione giusta per capire che fuori (o almeno sono troppo nuovo per capire il debugger, lol).

Nel mio caso ho usato un UIWebView e ho passato un NSString nel secondo parametro invece di un NSURL. Così ho il sospetto che i tipi di classe sbagliata passato a una le funzioni possono causare questo errore.

.. E ora la mia

ho avuto il pulsante collegato a un metodo che accede parametro di un altro tasto e che lavorano alla grande ma appena ho provato a fare qualcosa con il pulsante stesso, ho avuto un incidente. Durante la compilazione, è stato mostrato nessun errore .. Soluzione?

Non sono riuscito a collegare il pulsante per il proprietario del file. Quindi, se qualcuno qui è così stupido come me, provate questo:)

Ancora un altro leggermente diversa soluzione / caso.

Sto usando Xamarin e MvvmCross e stavo cercando di impegnare l'UIButton ad un ViewModel. Ho avuto l'UIButton cablata a una presa e un TouchUpInside.

Quando Binding Io uso solo l'Outlet:

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

Tutto quello che dovevo fare era rimuovere il collegamento l'azione (TouchUpInside) in XCode e che risolto.

P.S. Credo che questo è nella sua base di tutti collegati alle risposte precedenti e di @ Chris Kaminski in particolare, ma spero che questo aiuta qualcuno ...

Saluti.

Ho avuto lo stesso problema. Il problema per me era che un pulsante aveva due metodi di azione. Quello che ho fatto è stato creare un primo metodo di azione per il mio tasto e poi eliminato nel controller della vista, ma ha dimenticato di scollegare la connessione nello storyboard principale nella finestra di ispezione connessione. Così, quando ho aggiunto un secondo metodo di azione, ci sono stati ora due metodi d'azione per un pulsante, che ha causato l'errore.

Per me, è stato un collegamento avanzi creata in InterfaceBuilder bij ctrl-trascinamento. Il nome della connessione interrotta era in errore log

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

ho avuto un'azione legata a un pulsante. Premendo il pulsante si è schiantato l'app perché l'Outlet non esisteva più nel mio codice. Alla ricerca del nome nel registro mi ha portato ad esso nello storyboard. Cancellato, e l'incidente era sparito!

Nel mio caso ho risolto il problema dopo 2 ore:

Il mittente (un elemento tabBar) non aveva alcun punto vendita di riferimento.Quindi non puntava da nessuna parte.

Giusto creare uno sbocco di riferimento corrispondente alla tua funzione.

Spero che questo possa aiutarvi ragazzi.

Sto rispondendo alle Leonard Challis, da quando sono stato anche preso la classe C193P Stanford iOS, come era d'uso "oli206"

"Terminare app a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione:"

Il problema era che avevo il tasto "Enter" sulla calcolatrice collegata due volte, e un amico ha sottolineato che facendo un sopralluogo sul pulsante nella Storyboard ha dimostrato che 2 voci erano sul "Touch Up Inside" attributi quando ho destra cliccato sul tasto "Enter". Cancellazione di una delle due "Touch Up Inside" "Eventi inviata" risolto il problema.

Questo ha dimostrato che il problema viene attivato (per la classe di video C193P sulla calcolatrice Walkthrough on Assignment 1) come 2 eventi inviati, uno dei quali stava causando l'eccezione.

Può accadere quando non si assegna il ViewController al ViewControllerScene in l'InterfaceBuilder. Così il ViewController.m non è collegato a qualsiasi scena.

Tra cui la mia parte. Sono rimasto bloccato su questo per un po ', fino a quando mi sono reso conto che ho creato un progetto con ARC (riferimento conteggio automatico) nofollow disabilitato. Un rapido impostata su YES su tale opzione risolto il mio problema.

Un'altra causa veramente stupido di questo è aver selettore definito nell'interfaccia (.h) ma non nella realizzazione (.m) (a.e. typo)

Un altro motivo / soluzione da aggiungere alla lista. Questo è causato da iOS6.0 (e / o cattiva programmazione). Nelle versioni più vecchie del selettore corrisponderà se i tipi di parametri abbinati, ma in iOS 6.0 ho avuto crash nel codice precedentemente di lavoro in cui il nome del parametro non era corretta.

che stavo facendo qualcosa di simile

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

, ma nella definizione (sia .he .m) ho avuto

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

Questo ha funzionato bene su iOS5, ma non il 6, anche la stessa costruzione distribuite su dispositivi diversi.

Non capisco il motivo per cui il compilatore coudn't dirmi questo, in ogni caso - problema soled

.

Ciò potrebbe anche accadere quando si desidera impostare una proprietà da un ControllerA a una proprietà pubblica all'interno di una classe ControllerB costume e non è stata impostata la "Classe personalizzata" all'interno della finestra di ispezione identità storyboard ancora.

Il mio problema e la soluzione era diverso e ho pensato che avrei dovuto postare qui in modo che i lettori futuri possono salvare la loro testa da sbattere al muro.

Mi è stato l'assegnazione XI ter diverso per lo stesso UIViewController e anche dopo la ricerca in tutto il mondo non riuscivo a trovare il modo di correggerlo. Poi ho controllato il mio AppDelegate dove stavo chiamando initWithNibName e può vedere che durante la copia del codice, ho cambiato il nome XI ter, ma ho dimenticato di cambiare classe di UIViewController. Quindi, se nessuno della soluzione funziona per voi, controllare il metodo di initWithNibName.

È successo a me a causa di contrastanti argomenti vincolo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top