Frage

Ich habe eine Schaltfläche erstellt und eine Aktion dafür hinzugefügt, aber sobald sie aufgerufen wurde, habe ich diesen Fehler bekommen:

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

Dies ist mein Code:

- (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(@"---");
}
War es hilfreich?

Lösung

Es sieht so aus, als ob Sie nicht den Speicher des View -Controllers ordnungsgemäß verwalten, und er wird irgendwann ausgearbeitet - was das verursacht numberButtonClicked: Methode, die an ein anderes Objekt gesendet werden soll, das jetzt den Speicher besetzt, den der View Controller zuvor besetzte ...

Stellen Sie sicher, dass Sie Ihren View Controller ordnungsgemäß behalten/freigeben.

Andere Tipps

Für diejenigen, die hier über Google kommen, wie ich es getan habe, was wahrscheinlich mehr auf Xcode 4.2+/iOS 5+ mehr betrifft, was mit ARC. Ich hatte den gleichen Fehler "unerkannter Selektor, der an Instanz gesendet wurde". In meinem Fall hatte ich die Zielaktion eines Uibutton eingerichtet, um sich selbst als Absenderparameter zu übergeben, aber später erkannte ich es nicht und entfernte diesen in Code. Also, so etwas wie:

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

Wurde geändert in:

- (IBAction)buttonPressed {

Klicken Sie mit der rechten Maustaste auf den fraglichen Uibutton, dass das Boting -up -Ereignis mit der Methode der Ansicht Controller -Taste: Methode zugeordnet wurde. Das Entfernen und Neuzuweisungen in die modifizierte Methode hat eine Belohnung bearbeitet.

Dies war die Top -Google -Antwort für dieses Problem, aber ich hatte eine andere Ursache/ein anderes Ergebnis - ich dachte, ich würde meine beiden Cent hinzufügen, falls andere über dieses Problem stolpern.

Ich hatte erst heute Morgen ein ähnliches Problem. Ich habe festgestellt, dass Sie sehen, welche Verbindungen erstellt wurden, wenn Sie mit der rechten Maustaste auf das UI -Element klicken. In meinem Fall hatte ich einen Knopf mit bis zu zwei Aktionen. Ich habe die Aktionen aus dem Rechtsklickmenü gelöscht und sie neu verdrahtet und mein Problem wurde behoben.

Stellen Sie also sicher, dass Ihre Aktionen richtig verkabelt sind.

OK, ich muss hier reinkommen. Die Operation Dynamisch die Schaltfläche erstellt. Ich hatte ein ähnliches Problem und die Antwort (nach Stunden der Jagd) ist so einfach, dass ich krank gemacht habe.

Beim Benutzen:

action:@selector(xxxButtonClick:)

or (as in my case)

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

Wenn Sie am Ende der Saite einen Dickdarm platzieren, wird er den Absender übergeben. Wenn Sie den Dickdarm nicht am Ende der Saite platzieren, wird dies nicht der Fall, und der Empfänger erhält einen Fehler, wenn er einen erwartet. Es ist leicht, den Dickdarm zu verpassen, wenn Sie den Ereignisnamen dynamisch erstellen.

Die Empfängercodeoptionen sehen so aus:

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

Wie immer ist es immer die offensichtliche Antwort, die übersehen wird.

In meinem Fall erwartete die Funktion kein Argument, aber die Taste wurde so konfiguriert, dass sie einen verursachen, der den Fehler verursachte. Um dies zu beheben, musste ich den Event -Handler neu verdrahten.

Hier ist meine Funktion:

enter image description here

Beachten Sie, dass es keine Argumente enthält.

Hier ist ein Bild meiner Schaltflächenkonfiguration (klicken Sie mit der rechten Maustaste auf die Schaltfläche, um sie anzuzeigen):

enter image description here

Beachten Sie, dass es 3 Event -Handler gibt.

Um dies zu beheben, musste ich jedes der Ereigniselemente entfernen, da einer von ihnen einen Verweis auf sich selbst an die Unternehmensfunktion sendete. Um diese Elemente zu entfernen, habe ich auf das Little X -Symbol neben dem Namen jedes Elements geklickt, bis keine Elemente angezeigt wurden.

enter image description here

Als nächstes musste ich den Knopf wieder mit dem Ereignis verbinden. Halten Sie dazu die Steuertaste gedrückt und ziehen Sie dann eine Zeile von der Taste zur Aktion. Es sollte "Aktion verbinden". Hinweis: Ich musste Xcode neu starten, damit dies aus irgendeinem Grund funktioniert; Andernfalls kann ich nur Aktionen einfügen (auch bekannt als eine neue Aktion) über oder unter der Funktion.

enter image description here

Sie sollten jetzt einen einzelnen Ereignis -Handler mit dem Button -Ereignis verdrahtet haben, bei dem keine Argumente bestehen:

enter image description here

Diese Antwort ergänzt die Antwort von @leonard Challis, die Sie auch lesen sollten.

Dies kann auch passieren, wenn Sie die "Klasse" der Ansicht im Schnittstellenbuilder nicht festlegen.

In meinem Fall verwendete ich NSNotificationCenter und versuchte, einen Selektor zu verwenden, der keine Argumente entgegennahm, aber einen Dickdarm hinzufügte. Das Entfernen des Dickdarms hat das Problem behoben.

Verwenden Sie bei Verwendung eines Auswahlnamens keinen nachfolgenden Dickdarm, wenn es keine Argumente gibt. Wenn es ein Argument gibt, verwenden Sie einen nachfolgenden Dickdarm. Wenn es mehr als ein Argument gibt, müssen Sie sie zusammen mit einem nachfolgenden Dickdarm für jedes Argument benennen.

Siehe Adam Rosenfields Antwort hier: Selektoren in Objective-C?

Ich hatte dieses Problem mit einem schnellen Projekt, bei dem ich die Schaltflächen dynamisch erstelle. Problemcode:

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

Die Lösung bestand darin, einen vollen Dickdarm hinzuzufügen: 'Nach der Aktion: zB

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

Vollständiges Beispiel hier: https://developer.apple.com/library/content/samplecode/uicatalog/Listings/swift_uikitcatalog_defaulttoolbarviewController_Swift.html

Die offensichtlichste Ursache dafür (für die Vollständigkeit enthalten) ist, einen Zeiger nicht ordnungsgemäß zu wirken und eine Methode der falschen Klasse zu bezeichnen.

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

Ich hatte ein ähnliches Problem, aber für mich war die Lösung etwas anders. In meinem Fall habe ich eine Kategorie verwendet, um eine vorhandene Klasse zu erweitern (UIImage für einige Änderungsfunktionen - siehe dies wie man Für den Fall, dass Sie interessiert sind) und vergessen haben, die *.m -Datei zum Build -Ziel hinzuzufügen. Dummer Fehler, aber nicht immer offensichtlich, wenn es passiert, wo man schauen soll. Ich dachte, es lohnt sich zu teilen ...

Ich hatte den gleichen Fehler und entdeckte Folgendes:

Wenn Sie den Code verwenden

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

Sie mögen denken, dass es nach dem Selektor sucht:

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

Aber es ist tatsächlich auf der Suche nach dem Selektor:

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

Dieser Selektor existiert nicht, sodass Sie den Absturz erhalten.

Sie können den Selektor in den (ID) Absender ändern, um den Fehler zu lösen.

Aber was ist, wenn Sie andere Funktionen haben, die die Aktualisierungsfunktion aufrufen ohne Einen Absender bereitstellen? Sie benötigen eine Funktion, die für beide funktioniert. Einfache Lösung besteht darin, eine weitere Funktion hinzuzufügen:

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

Ändern Sie dann den Code für Aktualisierung von Pulldown, um diesen Selektor stattdessen aufzurufen:

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

Ich mache auch den Stanford iOS -Kurs auf einem älteren Mac, der nicht auf die neueste Version von Mac OSX aktualisiert werden kann. Ich baue also immer noch für iOS 6.1, und das löste das Problem für mich.

Ich hatte auch das gleiche Problem.

Ich habe mein Uibutton in meinem Storyboard gelöscht und es nachgebaut. Jetzt funktioniert alles gut.

Dies passierte meinem, weil versehentlich den Code "@ibaction func ..." in meinem UIViewController -Klassencode gelöscht wurde. Im Storyboard wurde im Storyboard das Referenz -Outlet erstellt, aber zur Laufzeit gab es eine Funktion, um ihn zu verarbeiten.

Die Lösung bestand darin, die Auslassreferenz im Eigenschaftsinspektor zu löschen und dann mit dem Befehlstaste zum Klassencode zu zeichnen.

Ich hoffe es hilft!

Ich denke, Sie sollten die Leere anstelle der Ibaktion als Rückkehrtyp verwenden. Weil Sie eine Schaltfläche programmatisch definiert haben.

Eine weitere mögliche Lösung: Hinzufügen '-objc' zu Ihren Linkerargumenten.

Vollständige Erklärung ist hier: Objektive-C-Kategorien in der statischen Bibliothek

Ich denke, der GIST ist: Wenn die Kategorie in einer Bibliothek definiert ist, mit der Sie statisch verlinken, ist der Linker nicht klug genug, um in Kategorienmethoden zu verknüpfen. Die obige Flag denkt Es muss auf der Analyse Ihrer Quelle basieren. (Bitte zögern Sie nicht, diese Antwort zu stimmen oder zu korrigieren. Ich bin gewusst zu verknüpften Sprachen, also habe ich hier nur parakten).

Ich lerne derzeit iOS -Entwicklung und mache das Buch "Anfänger iOS6 Development" von Apress. Ich habe in Kapitel 10 den gleichen Fehler bekommen: Storyboards.

Ich habe zwei Tage gebraucht, um es herauszufinden, aber ich fand heraus, dass ich versehentlich das Tag der TableView -Zelle auf 1 gesetzt habe, wenn ich nicht hätte tun hätten. Für alle anderen, die dieses Buch machen und einen ähnlichen Fehler erhalten, hoffe ich, dass dies hilft.

Ich hoffe wirklich, dass zukünftige Fehler in meinem Code leichter zu finden sind! hahaha. Der Debug -Fehler hat mich nichts in die richtige Richtung gedrängt, um es herauszufinden (oder zumindest bin ich zu neu, um den Debugger zu verstehen, lol).

In meinem Fall verwendete ich eine UIWebview und habe einen NSString im zweiten Parameter anstelle eines NSURL bestanden. Ich vermute also, dass falsche Klassentypen, die an eine Funktion übergeben werden, diesen Fehler verursachen können.

..Und jetzt meins

Ich hatte die Schaltfläche mit einer Methode verknüpft, die auf den Parameter eines anderen Taste zugegriffen hatte, und das funktionierte großartig, aber sobald ich versuchte, mit dem Knopf selbst etwas zu tun, bekam ich einen Absturz. Während des Kompilierens wurde kein Fehler angezeigt. Lösung?

Ich habe die Schaltfläche nicht mit dem Eigentümer der Datei verknüpft. Also, wenn jemand hier so dumm ist wie ich, probiere es aus :)

Noch eine etwas andere Lösung/ein wenig anderer Fall.

Ich verwende Xamarin und MVVMCross und habe versucht, das Uibutton an ein ViewModel zu binden. Ich hatte das Uibutton an eine Steckdose und einen Touchupinside.

Beim Binden benutze ich nur das Auslass:

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

Ich musste nur die Aktion (Touchupinside) in Xcode entfernen und sie löste.

PS Ich denke, das ist in seiner Basis alles mit den vorherigen Antworten und insbesondere auf @chris Kaminski zusammen, aber ich hoffe, das hilft jemandem ...

Prost.

Ich hatte das gleiche Problem. Das Problem für mich war, dass ein Knopf zwei Aktionsmethoden hatte. Ich habe eine erste Aktionsmethode für meine Schaltfläche erstellt und sie dann im View Controller gelöscht, aber vergessen, die Verbindung im Hauptstoryboard im Verbindungsinspektor zu trennen. Als ich also eine zweite Aktionsmethode hinzufügte, gab es jetzt zwei Aktionsmethoden für eine Taste, die den Fehler verursachten.

Für mich war es eine übrig gebliebene Verbindung, die im InterfaceBuilder BIJ Strg-Dragging erstellt wurde. Der Name der kaputten Verbindung war im Fehlerloggen

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

Ich hatte eine Aktion mit einem Knopf. Durch das Drücken der Taste wurde die App abgestürzt, da die Auslass nicht mehr in meinem Code vorhanden war. Die Suche nach dem Namen im Protokoll führte mich dazu im Storyboard. Löschte es und der Absturz war weg!

In meinem Fall löste ich das Problem nach 2 Stunden:

Der Absender (ein Tabbarelement) hatte keine Referenzierungsstelle. Also zeigte es nirgendwo hin.

Juste Erstellen Sie ein Referenzierungs -Outlet entsprechend Ihrer Funktion.

Hoffe das könnte euch helfen.

Ich antworte Leonard Challis, da ich auch die Stanford IOS -Klasse C193P genommen habe, ebenso wie Benutzer "OLI206"

"Beenden Sie die App aufgrund einer ungekordenen Ausnahme 'nsinvalidargumentException', Grund:"

Das Problem war, dass ich die Taste "Eingabetaste" auf dem Taschenrechner zweimal angeschlossen hatte, und ein Freund wies darauf hin, dass eine Untersuchung der Taste im Storyboard zeigte, dass sich 2 Einträge auf den Attributen "Innen" befanden, als ich mit der rechten Maustaste klickte, auf die ich auf Klick klickte, auf die Attribute "Inside" lagen, als ich darauf klickte, auf die 'Attribute innen "zu sein. die Schaltfläche "Eingeben". Das Löschen eines der beiden "Nachbesserung" "Ereignisse" löste das Problem.

Dies zeigte, dass das Problem ausgelöst wird (für die C193P -Videokasse auf der Taschenrechnung auf Zuordnung 1), wie 2 gesendete Ereignisse, von denen eine die Ausnahme verursachte.

Dies kann passieren, wenn Sie den ViewController nicht der ViewControllerscen im InterfaceBuilder zuweisen. Daher ist der ViewController.m mit keiner Szene verbunden.

Einschließlich meines Anteils. Ich bin für eine Weile daran festgefahren, bis mir klar wurde, dass ich ein Projekt erstellt habe ARC (automatische Zählreferenz) deaktiviert. Ein kurzes Set auf Ja bei dieser Option löste mein Problem.

Eine andere wirklich alberne Ursache dafür ist, dass der Selektor in der Schnittstelle (.H) definiert ist, aber nicht in der Implementierung (.m) (PE -Tippfehler)

Ein weiterer Grund/eine Lösung, die zur Liste hinzugefügt werden kann. Dieser wird durch iOS6.0 (und/oder schlechte Programmierung) verursacht. In älteren Versionen würde der Selektor übereinstimmen, wenn die Parametertypen übereinstimmen, aber in iOS 6.0 habe ich Abstürze in zuvor Arbeitscode erhalten, wobei der Name des Parameters nicht korrekt war.

Ich habe so etwas gemacht

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

aber in der Definition (beide .h und .m) hatte ich

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

Dies hat bei iOS5 gut funktioniert, aber nicht auf 6, selbst im gleichen Build, das auf verschiedenen Geräten eingesetzt wurde.

Ich verstehe nicht, warum der Compiler mir das sowieso nicht erzählt - Problem Soled.

Dies kann auch passieren, wenn Sie eine Eigenschaft von einer Controllera in eine öffentliche Eigenschaft in einer benutzerdefinierten ControllerB -Klasse einstellen möchten und die "benutzerdefinierte Klasse" noch nicht in den Identitätsinspektor in Storyboards festgelegt haben.

Mein Problem und meine Lösung waren anders und ich dachte, ich sollte es hier veröffentlichen, damit zukünftige Leser ihren Kopf vom Knaller bis zur Wand retten können.

Ich habe demselben UIViewController unterschiedliche XIB zugewiesen und selbst nachdem ich überall gesucht habe, konnte ich nicht feststellen, wie ich es korrigieren konnte. Dann habe ich mein AppDelegate überprüft, wo ich anrief initWithNibName Und kann sehen, dass ich beim Kopieren des Code den XIB -Namen geändert habe, aber vergessen habe, sich zu ändern UIViewController Klasse. Wenn also keine der Lösung für Sie funktioniert, überprüfen Sie Ihre initWithNibName Methode.

Ist mir wegen widersprüchlicher Einschränkungen der Argumente passiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top