it-swarm.com.de

Fehler "Unbekannter Selektor an Instanz gesendet" in Objective-C

Ich erstellte eine Schaltfläche und fügte eine Aktion hinzu. Sobald sie jedoch aufgerufen wurde, erhielt ich folgende Fehlermeldung:

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

Das 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(@"---");
}
141
HelloWorld

Es sieht so aus, als würden Sie den View-Controller nicht ordnungsgemäß verwalten, und er wird irgendwann freigegeben, wodurch die numberButtonClicked:-Methode an ein anderes Objekt gesendet wird, das jetzt den Speicher belegt, den der View-Controller zuvor belegt hat.

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

176
Jasarien

Für diejenigen, die über Google hierher gekommen sind, habe ich es getan, was wahrscheinlich mehr mit Xcode 4.2 +/iOS 5+ und mehr mit ARC zusammenhängt. Ich hatte den gleichen Fehler " nicht erkannter Selektor an Instanz " gesendet. In meinem Fall hatte ich die Zielaktion eines UIButton eingerichtet, um sich selbst als Senderparameter zu übergeben. Später wurde mir jedoch klar, dass ich sie nicht brauchte, und entfernte sie im Code. So etwas wie:

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

Wurde geändert in:

- (IBAction)buttonPressed {

Wenn Sie mit der rechten Maustaste auf den betreffenden UIB-Button klicken, wurde angezeigt, dass das Touch-Up-Inside-Ereignis mit der Methode buttonPressed: des View-Controllers verknüpft war. Dies zu entfernen und der modifizierten Methode neu zuzuweisen, erwies sich als Leckerbissen.

123
LeonardChallis

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

Ich hatte heute morgen ein ähnliches Problem. Wenn Sie mit der rechten Maustaste auf das Element der Benutzeroberfläche klicken, um das Problem anzuzeigen, können Sie feststellen, welche Verbindungen erstellt wurden. In meinem Fall hatte ich eine Taste, die mit zwei Aktionen verbunden war. Ich habe die Aktionen aus dem Rechtsklick-Menü gelöscht und sie erneut verbunden und mein Problem wurde behoben.

Stellen Sie also sicher, dass die Aktionen richtig verdrahtet sind.

68
Chris K

OK, ich muss hier einsteigen. Das OP erstellt dynamisch die Schaltfläche . Ich hatte ein ähnliches Problem und die Antwort (nach stundenlanger Jagd) ist so einfach, dass ich krank wurde.

Beim Benutzen:

action:@selector(xxxButtonClick:)

or (as in my case)

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

Wenn Sie am Ende der Zeichenfolge einen Doppelpunkt setzen, wird der Absender übergeben. Wenn Sie den Doppelpunkt nicht am Ende der Zeichenfolge platzieren, wird dies nicht geschehen, und der Empfänger erhält eine Fehlermeldung, wenn er einen erwartet. Es ist leicht, den Doppelpunkt zu übersehen, wenn Sie den Ereignisnamen dynamisch erstellen.

Die Empfängercode-Optionen sehen folgendermaßen aus:

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

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

24
Craig H.

In meinem Fall erwartete die Funktion kein Argument, aber die Schaltfläche war so konfiguriert, dass sie ein Element sendet, das den Fehler verursacht. Um dies zu beheben, musste ich den Event-Handler neu verkabeln. 

Hier ist meine Funktion: 

enter image description here

Beachten Sie, dass es keine Argumente enthält. 

Hier ist ein Bild meiner Button-Konfiguration (Rechtsklick auf den Button, um sie anzuzeigen): 

enter image description here

Beachten Sie, dass es 3 Ereignishandler gibt. 

Um dieses Problem zu beheben, musste ich jedes Ereigniselement entfernen, da einer von ihnen einen Verweis auf sich selbst an die enterPressed-Funktion sendete. Um diese Elemente zu entfernen, klickte ich auf das kleine x-Symbol neben dem Namen jedes Elements, bis keine Elemente angezeigt wurden. 

enter image description here

Als nächstes musste ich den Button wieder mit dem Event verbinden. Halten Sie dazu die Strg-Taste gedrückt und ziehen Sie eine Linie von der Schaltfläche zur Aktion. Es sollte "Connect Action" sagen. Hinweis: Ich musste XCode aus irgendeinem Grund neu starten, damit dies funktioniert. Ansonsten lassen sich nur Aktionen oberhalb der Funktion oder unterhalb der Funktion einfügen. 

enter image description here

Sie sollten jetzt einen einzelnen Event-Handler haben, der mit dem Button-Ereignis verbunden ist und keine Argumente übergibt. 

enter image description here

Diese Antwort ergänzt die Antwort von @Leonard Challis, die Sie ebenfalls lesen sollten. 

22
1.21 gigawatts

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

14
user1658373

In meinem Fall verwendete ich NSNotificationCenter und versuchte, einen Selektor zu verwenden, der keine Argumente entnahm, aber einen Doppelpunkt hinzufügte. Durch das Entfernen des Doppelpunkts wurde das Problem behoben.

Verwenden Sie bei Verwendung eines Selektornamens keinen abschließenden Doppelpunkt, wenn keine Argumente vorhanden sind. Wenn es ein Argument gibt, verwenden Sie einen Doppelpunkt. Wenn es mehrere Argumente gibt, müssen Sie sie zusammen mit einem nachgestellten Doppelpunkt für jedes Argument benennen.

Sehen Sie hier die Antwort von Adam Rosenfield: Selektoren in Ziel C

12

Ich hatte dieses Problem mit einem Swift-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, nach der Aktion einen vollen Doppelpunkt ':' hinzuzufügen: z.

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

11
FredL

Die offensichtlichste Ursache (die der Vollständigkeit halber eingeschlossen ist) besteht darin, dass ein Zeiger nicht ordnungsgemäß geworfen und eine Methode der falschen Klasse aufgerufen wird.

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

Ich hatte den gleichen Fehler und entdeckte Folgendes:

Wenn Sie den Code verwenden

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

Sie denken vielleicht, dass es nach dem Selektor sucht:

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

Aber es sucht eigentlich nach dem Selektor:

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

Diese Auswahl ist nicht vorhanden, daher kommt es zu einem Absturz.

Sie können den Selektor so ändern, dass er den Absender (ID) empfängt, um den Fehler zu beheben.

Was aber, wenn Sie andere Funktionen haben, die die Refresh-Funktion aufrufen ohne einen Absender bereitzustellen? Sie benötigen eine Funktion, die für beide funktioniert. Eine einfache Lösung besteht darin, eine weitere Funktion hinzuzufügen:

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

Und ändern Sie dann den Aktualisierungs-Pulldown-Code, um stattdessen diesen Selektor 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 hat das Problem für mich gelöst.

3
Joseph Pride

Ich hatte auch das gleiche Problem.

Ich habe mein Uibutton in meinem Storyboard gelöscht und neu erstellt .. jetzt funktioniert alles gut. 

3
Yohan Dahmani

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 Möglichkeiten zur Größenänderung - siehe howto , falls Sie interessiert sind) und habe vergessen, die * .m-Datei zum Build-Ziel hinzuzufügen. Dummer Fehler, aber nicht immer offensichtlich, wenn es darum geht, wo man suchen muss. Ich dachte, es lohnt sich zu teilen ...

3
Mirko Jahn

Ich denke, Sie sollten die Void anstelle der IBAction als Rückgabetyp verwenden. weil Sie programmgesteuert eine Schaltfläche definiert haben. 

2
Fa.Shapouri

Dies geschah bei mir, weil versehentlich die "@IBAction-Funktion" in meinem UIViewcontroller-Klassencode gelöscht wurde. In diesem Storyboard wurde das Reference-Outlet erstellt. Zur Laufzeit gab es jedoch eine Funktion, die es verarbeiten konnte. 

Die Lösung bestand darin, die Outlet-Referenz im Eigenschafteninspektor zu löschen und sie anschließend mit dem Befehlstaste in den Klassencode zu ziehen.

Ich hoffe es hilft!

2
Guillermo

Ich hatte das gleiche Problem. Das Problem für mich war, dass ein Knopf zwei Aktionsmethoden hatte. Was ich getan habe, war, eine erste Aktionsmethode für meine Schaltfläche zu erstellen und sie dann im Ansichtscontroller zu löschen, vergaß jedoch, die Verbindung im Haupt-Storyboard des Verbindungsinspektors zu trennen. Wenn ich also eine zweite Aktionsmethode hinzufügte, gab es jetzt zwei Aktionsmethoden für eine Schaltfläche, die den Fehler verursachten. 

1
Harshil.Chokshi

Noch eine etwas andere Lösung/Fall. 

Ich verwende Xamarin und MvvmCross und habe versucht, den UIButton an ein ViewModel zu binden. Ich hatte den UIButton an ein Outlet und ein TouchUpInside angeschlossen.

Beim Binden verwende ich nur das Outlet:

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

Alles was ich tun musste, war die Action (TouchUpInside) -Verbindung in XCode zu entfernen und damit gelöst. 

P.S . Ich denke, das ist in seiner Basis alles auf die vorherigen Antworten und insbesondere auf @Chris Kaminski bezogen, aber ich hoffe, das hilft jemandem ...

Prost. 

1
YKa

..Und jetzt meins

Ich hatte den Button mit einer Methode verknüpft, die auf einen anderen Button-Parameter zugab, und das funktionierte prima, ABER sobald ich versuchte, etwas mit dem Button selbst zu tun, bekam ich einen Absturz. Während des Kompilierens wurde kein Fehler angezeigt. Lösung?

Ich konnte die Schaltfläche nicht mit dem Besitzer der Datei verknüpfen. Wenn also jemand hier so dumm ist wie ich, probiere es aus :)

1
user2875404

In meinem Fall habe ich eine UIWebView verwendet und ich habe einen NSString im zweiten Parameter anstelle einer NSURL übergeben. Ich vermute also, dass falsche Klassentypen, die an Funktionen übergeben wurden, diesen Fehler verursachen können. 

1
jbaylina

Ich lerne gerade iOS-Entwicklung und gehe das Buch "Beginning iOS6-Entwicklung" von aPress durch. In Kapitel 10: Storyboards wurde der gleiche Fehler angezeigt.

Ich brauchte zwei Tage, um das herauszufinden, aber ich stellte fest, dass ich das TableView-Zellen-Tag aus Versehen auf 1 gesetzt habe, als ich es nicht hätte tun sollen. Für alle anderen, die dieses Buch lesen und eine ähnliche Fehlermeldung 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 nichts getan. Schieben Sie mich in die richtige Richtung, um es herauszufinden (oder zumindest bin ich zu neu, um den Debugger zu verstehen, lol).

1
Shannon Cole

In meinem Fall habe ich das Problem nach 2 Stunden gelöst:

Der Absender (ein TabBar-Element) hatte keinen Referenzauslass . Es zeigte also nirgendwohin.

Juste Erstellen Sie eine Referenz-Outlet entsprechend Ihrer Funktion.

Ich hoffe, das könnte euch helfen.

1
André DS

Für mich war es eine übrig gebliebene Verbindung, die im Interfacebuilder durch Ziehen der Strg-Taste erstellt wurde. Der Name der unterbrochenen Verbindung war im Fehlerprotokoll

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

Ich hatte eine Aktion, die mit einer Schaltfläche verknüpft war. Durch Drücken der Schaltfläche stürzte die App ab, da das Outlet nicht mehr in meinem Code vorhanden war. Die Suche nach dem Namen im Protokoll führte mich im Storyboard dazu. Gelöscht, und der Absturz war weg!

1
Tom Brinkkemper

Eine weitere wirklich dumme Ursache dafür ist, dass der Selektor in der Schnittstelle (.h) definiert ist, aber nicht in der Implementierung (.m) (p.e. typo).

0
jla

Ich antworte Leonard Challis, da ich auch die Stanford iOS-Klasse C193P genommen habe, ebenso wie Benutzer "oli206".

"Beenden der App wegen nicht abgerufener Ausnahme 'NSInvalidArgumentException', Grund:"

Das Problem war, dass ich die "Enter" -Taste auf dem Rechner zweimal angeschlossen hatte, und ein Freund wies darauf hin, dass eine Überprüfung der Schaltfläche im Storyboard zeigte, dass sich 2 Einträge auf den "Touch Up Inside" -Attributen befanden, als ich mit der rechten Maustaste darauf klickte die "Enter" -Taste. Durch das Löschen eines der beiden "Nachgeschalteten Objekte" "Gesendete Ereignisse" wurde das Problem behoben.

Dies zeigte, dass das Problem (für die C193P-Videoklasse in der Calculator Walkthrough zu Zuweisung 1) durch zwei gesendete Ereignisse ausgelöst wurde, von denen eines die Ausnahme verursachte.

0
Peter_from_NYC

Ich hatte dies, nachdem ich von Swift 2 zu Swift 3 gewechselt hatte. Die folgende Beschreibung ist spezifisch, aber Sie sehen den generischen Fall, der viele mögliche Fehler abdeckt.

Ich hatte eine Methode namens delete in meiner Unterklasse von SKNode

func delete(thing: SomeType) 

Es gibt bereits eine Methode delete auf UIResponder, aber meine Methode hat sie (unbeabsichtigt) überlastet, also funktionierte sie einwandfrei. Beim Upgrade auf Swift 3 wurde Folgendes geändert:

func delete(_ thing: SomeType) 

Immer noch am arbeiten. Aber dann entschied ich mich für Swift3ify und machte den Parameter obligatorisch:

func delete(thing: SomeType)

das hätte gut funktioniert, wenn ich mich daran erinnerte, den Aufrufer zu aktualisieren, aber das tat ich nicht. Jetzt ruft der Aufrufer die delete-Methode no-parameter-name mit einem falschen Argumenttyp in UIResponder auf.

Dies kann natürlich bei einer langen Liste von Standardmethoden in SKNode (und wahrscheinlich UIView) der Fall sein, die Any als Argument betrachten und daher die Kompilierungsphase durchlaufen, aber beim Aufruf fallen.

0
rghome

Mein Fall war: collectionView in einer Ansicht

Ich habe versucht, den gestureRecognizer in einer config()-Methode hinzuzufügen, die ich selbst geschrieben habe ..__ Nach einiger Umgehung habe ich das gefunden Ich muss einfach den Code innerhalb der awakeFromNib() verschieben.

override func awakeFromNib() {

   //other code

   let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:)))
   self.collectionView.addGestureRecognizer(longPressGesture)
}

Und es hat gut funktioniert.

Ich hoffe, das kann jemandem helfen.

0
Federico Arvat

Ein weiterer Grund/eine andere Lösung, um sie der Liste hinzuzufügen. Dies wird durch iOS6.0 (und/oder schlechte Programmierung) verursacht. In älteren Versionen stimmte der Selektor überein, wenn die Parametertypen übereinstimmten. In iOS 6.0 kam es jedoch zu Abstürzen in zuvor funktionierendem Code, bei dem 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 funktionierte gut unter iOS5, aber nicht unter 6, selbst wenn genau derselbe Build auf verschiedenen Geräten bereitgestellt wurde.

Ich verstehe nicht, warum der Compiler mir das sowieso nicht sagen konnte - Problemlösung.

0
Tim T

Mein Problem und meine Lösung waren anders und ich dachte, ich sollte es hier posten, damit zukünftige Leser ihren Kopf vor dem Hämmern retten können. 

Ich habe dem gleichen UIVIewController verschiedene xib zugewiesen und selbst nachdem ich überall gesucht hatte, konnte ich nicht finden, wie ich es korrigieren könnte. Dann überprüfte ich mein AppDelegate, wo ich initWithNibName anrief, und sehe, dass ich beim Kopieren des Codes den Xib-Namen geändert habe, aber die UIViewController-Klasse nicht geändert habe. Wenn also keine Lösung für Sie geeignet ist, überprüfen Sie Ihre initWithNibName-Methode.

0
noob

Einschließlich meines Anteils. Ich blieb eine Weile stehen, bis mir klar wurde, dass ich ein Projekt mit ARC (Referenz für automatische Zählung) erstellt habe. Eine schnelle Einstellung auf JA für diese Option löste mein Problem.

0
caiocpricci2

Dies kann passieren, wenn Sie den ViewController nicht der ViewControllerScene in Dem InterfaceBuilder zuweisen. Der ViewController.m ist also mit keiner Szene verbunden.

0
Vincent

In meinem Fall: 

Meine Protokolldefinition 

 @protocol MyProtocol

- (void)Method;

@end

und ich habe die Implementierung der Delegat-Methoden vergessen.

hoffe es könnte jemandem helfen. 

0
liu jeff

Ich habe dieses Problem mit einem alten Formatcode in Swift3 ausprobiert. 

let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respond))

action:"respond:" in action ändern: #selector(self.respond) hat das Problem für mich behoben.

0
sabithpocker

Dies kann auch der Fall sein, wenn Sie eine Eigenschaft von einer ControllerA auf eine öffentliche Eigenschaft in einer benutzerdefinierten ControllerB-Klasse festlegen möchten und in Storyboards noch keine "benutzerdefinierte Klasse" im Identitätsinspektor festgelegt haben.

Grundlagen: Dynamisches Aufrufen

Das Objective C ist eine dynamische Sprache, die Methoden aufruft, indem sie zur Laufzeit nach Methoden in Klassen sucht. Wenn zum Beispiel Class A einschließlich der Methode DoSomething (arg1, arg2) vorhanden ist. Wenn Sie versuchen, die Methode mit korrekten Argumenten für ein Objekt von Class A aufzurufen, funktioniert alles einwandfrei. Wenn die Argumente jedoch nicht ordnungsgemäß übergeben werden, z. B. wenn Sie die Methode nur mit einem Argument aufgerufen haben, wird die Laufzeit dies als Methodenaufruf für eine andere Methode behandeln. Eventuell kann die Laufzeit die Methode (DoSomething mit einem Argument) nicht finden und wird durch diese Ausnahme "nicht erkannter Selektor an Instanz" gesendet. 

Lösung

Bitte prüfen Sie, welche signature für @selector erwartet werden. Normalerweise ist es so, wie Sie es im Code beschrieben haben

-(IBAction)numberButtonClick:(id)sender{
0
hadaytullah

Eine andere mögliche Lösung: Fügen Sie '-ObjC' zu Ihren Linker-Argumenten hinzu.

Die vollständige Erklärung finden Sie hier: Objective-C-Kategorien in der statischen Bibliothek

Ich denke, das Wesentliche ist: Wenn die Kategorie in einer Bibliothek definiert ist, mit der Sie statisch verknüpfen, ist der Linker nicht intelligent genug, um in Kategoriemethoden zu verlinken. Das Flag oben macht den Linker-Link in allen Objective-C-Klassen und -Kategorien, nicht nur in jenen, die denkt, dass er auf der Analyse der Quelle basiert. (Bitte zögern Sie nicht, diese Antwort zu ändern oder zu korrigieren. Ich kannte die verknüpften Sprachen, also plappere ich hier nur).

0
Russ Egan

Ist mir wegen widersprüchlicher Zwangsargumente passiert.

0
Alex Bedro

Ich bekam auch das Problem und endlich fand ich die Lösung für mein Problem. Ich habe die controller'sUI im Storyboard erstellt, aber die controller'sUI hat ihre Kontrolle nicht auf Code bezogen, ich benutze diesen Code für init vc:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Me" bundle:nil];
    [sb instantiateViewControllerWithIdentifier:@"HeaderViewController"];

Dieser Code verursacht das Problem und nachdem ich den init-Code wie folgt geändert habe, habe ich das Problem behoben:

HeaderViewController *head_vc = [[HeaderViewController alloc] init];
0
aircraft