niet-herkende selector verzonden naar instantie fout in Objective-C

Ik heb een knop gemaakt en er een actie voor toegevoegd, maar zodra deze werd aangeroepen, kreeg ik deze foutmelding:

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

Dit is mijn 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(@"---");
}

Antwoord 1, autoriteit 100%

Het lijkt erop dat je geheugen de view-controller niet goed beheert en dat de toewijzing ervan op een bepaald moment ongedaan wordt gemaakt – waardoor de methode numberButtonClicked:naar een ander object wordt gestuurd dat nu het geheugen in beslag neemt dat de viewcontroller eerder bezig was…

Zorg ervoor dat u uw weergavecontroller op de juiste manier vasthoudt/loslaat.


Antwoord 2, autoriteit 68%

Voor degenen die hier via Google komen, zoals ik deed, wat waarschijnlijk meer te maken heeft met Xcode 4.2+/iOS 5+ meer, wat met ARC. Ik kreeg dezelfde foutmelding “niet-herkende selector verzonden naar instantie“. In mijn geval had ik de doelactie van een UIButton ingesteld om zichzelf door te geven als de afzenderparameter, maar realiseerde me later dat ik het niet nodig had en verwijderde dat in code. Dus zoiets als:

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

Was gewijzigd in:

- (IBAction)buttonPressed {

Rechts klikken op de betreffende UIButton toonde aan dat de Touch Up Inside-gebeurtenis was gekoppeld aan de view controllers buttonPressed: methode. Dit verwijderen en opnieuw toewijzen aan de gewijzigde methode werkte een traktatie.


Antwoord 3, autoriteit 40%

Dit was het beste Google-antwoord voor dit probleem, maar ik had een andere oorzaak/resultaat – ik dacht dat ik mijn twee cent zou toevoegen voor het geval anderen dit probleem tegenkomen.

Ik had vanmorgen een soortgelijk probleem. Ik ontdekte dat als je met de rechtermuisknop op het UI-item klikt dat je het probleem geeft, je kunt zien welke verbindingen zijn gemaakt. In mijn geval had ik een knop bedraad tot twee acties. Ik heb de acties uit het rechtsklikmenu verwijderd en opnieuw bedraad en mijn probleem was opgelost.

Zorg er dus voor dat je acties goed zijn aangesloten.


Antwoord 4, autoriteit 13%

Ok, ik moet hier even induiken. De OP heeft de knop dynamisch gemaakt. Ik had een soortgelijk probleem en het antwoord (na uren jagen) is zo simpel dat ik er misselijk van werd.

Bij gebruik:

action:@selector(xxxButtonClick:)
or (as in my case)
action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

Als u een dubbele punt aan het einde van de tekenreeks plaatst, wordt de afzender doorgegeven. Als u de dubbele punt niet aan het einde van de tekenreeks plaatst, gebeurt dit niet en krijgt de ontvanger een foutmelding als hij er een verwacht. Het is gemakkelijk om de dubbele punt over het hoofd te zien als u de naam van het evenement dynamisch maakt.

De opties voor de ontvangercode zien er als volgt uit:

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

Zoals gewoonlijk is het altijd het voor de hand liggende antwoord dat wordt gemist.


Antwoord 5, autoriteit 12%

In mijn geval verwachtte de functie geen argument, maar de knop was geconfigureerd om er een te verzenden die de fout veroorzaakt. Om dit op te lossen moest ik de event-handler opnieuw bedraden.

Hier is mijn functie:

voer hier afbeeldingsbeschrijving in

Merk op dat het geen argumenten bevat.

Hier is een afbeelding van mijn knopconfiguratie (klik met de rechtermuisknop op de knop om deze te bekijken):

voer hier de afbeeldingsbeschrijving in

Merk op dat er 3 gebeurtenishandlers zijn.

Om dit op te lossen moest ik elk van de gebeurtenisitems verwijderen, omdat een ervan een verwijzing naar zichzelf naar de functie enterPressed stuurde. Om deze items te verwijderen, klikte ik op het kleine x-pictogram naast de naam van elk item totdat er geen items werden weergegeven.

voer hier de afbeeldingsbeschrijving in

Vervolgens moest ik de knop opnieuw verbinden met het evenement. Houd hiervoor de Control-toets ingedrukt en sleep vervolgens een lijn van de knop naar de actie. Er zou “Connect Action” moeten staan. Opmerking: om de een of andere reden moest ik XCode opnieuw opstarten om dit te laten werken; anders kan ik alleen acties invoegen (ook wel een nieuwe actie maken) boven of onder de functie.

voer hier de afbeeldingsbeschrijving in

Je zou nu een enkele event handler moeten hebben aangesloten op de button event die geen argumenten doorgeeft:

voer hier de afbeeldingsbeschrijving in

Dit antwoord is een aanvulling op het antwoord van @Leonard Challis, dat u ook zou moeten lezen.


Antwoord 6, autoriteit 7%

Dit kan ook gebeuren als u de “Klasse” van de weergave niet instelt in de interfacebuilder.


Antwoord 7, autoriteit 7%

In mijn geval gebruikte ik NSNotificationCenter en probeerde ik een selector te gebruiken die geen argumenten nodig had, maar een dubbele punt toevoegde. Het verwijderen van de dubbele punt loste het probleem op.

Als u een selectornaam gebruikt, gebruik dan geen dubbele dubbele punt als er geen argumenten zijn. Als er één argument is, gebruik dan een dubbele dubbele punt. Als er meer dan één argument is, moet u ze samen met een dubbele punt achter elk argument noemen.

Bekijk het antwoord van Adam Rosenfield hier: Selectors in Objective-C?


Antwoord 8, autoriteit 6%

Ik had dit probleem met een Swift-project waarbij ik de knoppen dynamisch maak. Probleemcode:

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

De oplossing was om een ​​volledige dubbele punt ‘:’ toe te voegen na de actie: bijvoorbeeld

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

Volledig voorbeeld hier: https://developer.apple .com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html


Antwoord 9, autoriteit 4%

De meest voor de hand liggende oorzaak hiervan (voor de volledigheid opgenomen) is het onjuist casten van een pointer en het aanroepen van een methode van de verkeerde klasse.

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

Antwoord 10, autoriteit 2%

Ik had hetzelfde probleem.

Ik heb mijn uibutton in mijn storyboard verwijderd en opnieuw gemaakt .. nu werkt alles goed.


Antwoord 11, autoriteit 2%

Ik had een soortgelijk probleem, maar voor mij was de oplossing iets anders. In mijn geval heb ik een categorie gebruikt om een ​​bestaande klasse uit te breiden (UIImage voor enkele mogelijkheden om de grootte aan te passen – zie deze howtovoor het geval je geïnteresseerd bent) en vergat het *.m-bestand toe te voegen aan het builddoel. Domme fout, maar niet altijd duidelijk wanneer het gebeurt waar te kijken. Ik vond het de moeite waard om te delen…


Antwoord 12, autoriteit 2%

Een andere mogelijke oplossing: voeg ‘-ObjC’ toe aan uw linkerargumenten.

Volledige uitleg vindt u hier: Objective-C-categorieën in statische bibliotheek

Ik denk dat de essentie is: als de categorie is gedefinieerd in een bibliotheek waarmee u statisch linkt, is de linker niet slim genoeg om in categoriemethoden te linken. De vlag hierboven maakt de linkerlink in alle objectieve C-klassen en -categorieën, niet alleen degene die hij denktnodig heeft op basis van het analyseren van je bron. (Voel je vrij om dat antwoord af te stemmen of te corrigeren. Ik ben bekend met gekoppelde talen, dus ik praat hier gewoon na).


Antwoord 13, autoriteit 2%

Dit overkwam mij omdat ik per ongeluk de ” @IBAction func… ” in mijn UIViewcontroller-klassecode wist, dus in het Storyboard werd de Reference Outlet gemaakt, maar tijdens runtime was er een functie om het te verwerken.

De oplossing was om de Outlet-referentie in de eigenschappencontrole te verwijderen en deze vervolgens opnieuw te maken door met de opdrachttoets naar de klassecode te slepen.

Hopelijk helpt het!


Antwoord 14

Ik denk dat je de void moet gebruiken in plaats van de IBAction in het retourtype. omdat u een knop programmatisch hebt gedefinieerd.


Antwoord 15

Ik had dezelfde fout en ontdekte het volgende:

Als je de code gebruikt

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

Misschien denkt u dat hij naar de selector zoekt:

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

Maar het is eigenlijk op zoek naar de selector:

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

Die selector bestaat niet, dus je krijgt de crash.

U kunt de selector wijzigen om (id)afzender te ontvangen om de fout op te lossen.

Maar wat als je andere functies hebt die de vernieuwingsfunctie aanroepen zondereen afzender op te geven? Je hebt één functie nodig die voor beide werkt. Eenvoudige oplossing is om een ​​andere functie toe te voegen:

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

En pas dan de verversings-pulldown-code aan om in plaats daarvan die selector aan te roepen:

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

Ik volg ook de Stanford iOS-cursus op een oudere Mac die niet kan worden geüpgraded naar de nieuwste versie van Mac OSX. Dus ik ben nog steeds aan het bouwen voor iOS 6.1, en dit heeft het probleem voor mij opgelost.


Antwoord 16

In mijn geval heb ik het probleem na 2 uur opgelost:

De afzender (een tabBar-item) had geen verwijzende outlet. Dus het wees nergens naar.

Gewoon maak een referentiepuntdat overeenkomt met uw functie.

Ik hoop dat dit jullie kan helpen.


Antwoord 17

Ik ben momenteel bezig met het leren van iOS-ontwikkeling en lees het boek “Beginning iOS6 Development” van aPress. Ik kreeg dezelfde fout in Hoofdstuk 10:Storyboards.

Het kostte me twee dagen om erachter te komen, maar ik kwam erachter dat ik per ongeluk de tag van de TableView-cel op 1 had gezet terwijl ik dat niet had moeten doen. Voor iedereen die dit boek doet en een soortgelijke foutmelding krijgt, hoop ik dat dit helpt.

Ik hoop echt dat toekomstige fouten in mijn code gemakkelijker te vinden zijn! haha. De debug-fout heeft me niet in de goede richting geduwd om het uit te zoeken (of ik ben tenminste te nieuw om de debugger te begrijpen, lol).


Antwoord 18

In mijn geval gebruikte ik een UIWebView en gaf ik een NSString door in de tweede parameter in plaats van een NSURL. Dus ik vermoed dat verkeerde klassentypen die aan een functie zijn doorgegeven, deze fout kunnen veroorzaken.


Antwoord 19

..En nu de mijne

Ik had de knop gekoppeld aan een methode die toegang had tot de parameter van een andere knop en dat werkte prima MAAR zodra ik iets met de knop zelf probeerde te doen, kreeg ik een crash. Tijdens het compileren is er geen fout weergegeven. Oplossing?

Ik kon de knop niet koppelen aan de eigenaar van het bestand. Dus als iemand hier net zo dom is als ik, probeer dit dan eens 🙂


Antwoord 20

Nog een iets andere oplossing/case.

Ik gebruik Xamarin en MvvmCross en ik probeerde de UIButton te binden aan een ViewModel. Ik had de UIButton aangesloten op een stopcontact en een TouchUpInside.

Bij het binden gebruik ik alleen de Outlet:

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

Het enige wat ik hoefde te doen was de actieverbinding (TouchUpInside) in XCode verwijderen en dat loste het op.

P.S.
Ik denk dat dit in de basis allemaal verband houdt met de vorige antwoorden en in het bijzonder met @Chris Kaminski, maar ik hoop dat dit iemand helpt…

Proost.


Antwoord 21

Ik had hetzelfde probleem. Het probleem voor mij was dat één knop twee actiemethoden had. Wat ik deed, was een eerste actiemethode voor mijn knop maken en deze vervolgens verwijderen in de viewcontroller, maar vergat de verbinding in het hoofdverhaalbord in de verbindingsinspecteur te verbreken. Dus toen ik een tweede actiemethode toevoegde, waren er nu twee actiemethoden voor één knop, wat de fout veroorzaakte.


Antwoord 22

Voor mij was het een overgebleven verbinding gemaakt in interfacebuilder door ctrl-slepen. De naam van de verbroken verbinding stond in het foutenlogboek

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

Ik had een actie gekoppeld aan een knop. Door op de knop te drukken crashte de app omdat de Outlet niet meer bestond in mijn code.
Zoeken naar de naam in het logboek leidde me naar het in het storyboard. Verwijderd en de crash was weg!


Antwoord 23

Debuggen van niet-herkende selector verzenden naar instantie

In de meeste gevallen brengt Xcode ons niet naar de exacte regel waar dit probleem zich voordoet. Wanneer de app crasht, ziet u de coderegel die dit heeft veroorzaakt niet, maar wordt u naar de App-gemachtigdeklas gebracht, met een foutoutput als volgt:

[UITableViewCellContentView image]: unrecognized selector sent to instance

of

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

of

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestApp.MyViewController viewDidLoad:]: unrecognized selector sent to instance 0xDABCDD'

Hoe een coderegel te vinden die dit veroorzaakt:

Ga naar breekpunt-navigator. Klik op de optie + . klik op Uitzonderingsbreekpunt . Er verschijnt een nieuwe widget zoals de volgende.

voer hier de afbeeldingsbeschrijving in

Voeg het volgende voorwaardeblok toe:

-[NSObject(NSObject) doesNotRecognizeSelector:]

voer hier de afbeeldingsbeschrijving in

U kunt ook een breekpunt plaatsen voor alle uitzonderingen.
Voer nu uw code opnieuw uit. deze keer wordt het breekpunt geactiveerd wanneer deze uitzondering optreedt.

GESCHREVEN DOOR: Prafulla Singh

Volledige uitleg: https:// prafullkumar77.medium.com/how-to-debug-unrecognized-selector-send-to-instance-402473bc23d


Antwoord 24

Ik reageer op Leonard Challis, aangezien ik ook de Stanford iOS-klasse C193P volgde, net als gebruiker “oli206”

“Beëindiging van app vanwege niet-afgevangen uitzondering ‘NSInvalidArgumentException’, reden:”

Het probleem was dat ik de “Enter”-knop op de rekenmachine twee keer had aangesloten, en een vriend wees erop dat bij inspectie van de knop in het Storyboard bleek dat er twee items op de “Touch Up Inside”-attributen stonden toen ik met de rechtermuisknop op de knop “Enter” geklikt. Het wissen van een van de twee “Touch Up Inside” “Sent Events” loste het probleem op.

Hieruit bleek dat het probleem werd geactiveerd (voor de C193P-videoklasse op de Calculator Walkthrough on Assignment 1) als 2 verzonden gebeurtenissen, waarvan er één de uitzondering veroorzaakte.


Antwoord 25

Het kan gebeuren wanneer u de ViewController niet toewijst aan de ViewControllerScene in
de InterfaceBuilder. Dus de ViewController.m is niet verbonden met een scène.


Antwoord 26

Inclusief mijn aandeel. Ik zat hier een tijdje mee vast, totdat ik me realiseerde dat ik een project heb gemaakt met ARC(Automatische telreferentie)uitgeschakeld. Een snelle instelling op JA voor die optie loste mijn probleem op.


Antwoord 27

Een andere heel dwaze oorzaak hiervan is dat de selector is gedefinieerd in de interface (.h) maar niet in de implementatie (.m) (bijv. typfout)


Antwoord 28

Nog een reden/oplossing om aan de lijst toe te voegen. Deze wordt veroorzaakt door iOS6.0 (en/of slechte programmering). In oudere versies zou de selector overeenkomen als de parametertypes overeenkwamen, maar in iOS 6.0 kreeg ik crashes in eerder werkende code waarbij de naam van de parameter niet correct was.

Ik deed iets als

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

maar in de definitie (zowel .h als .m) had ik

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

Dit werkte prima op iOS5, maar niet op 6, zelfs niet met exact dezelfde build op verschillende apparaten.

Ik begrijp niet waarom de compiler me dit in ieder geval niet kon vertellen – probleem opgelost.


Antwoord 29

Dit kan ook gebeuren wanneer u een eigenschap wilt instellen van een ControllerA naar een openbare eigenschap binnen een aangepaste ControllerB-klasse en u de “Aangepaste klasse” nog niet hebt ingesteld in de identiteitscontrole in storyboards.


Antwoord 30

Mijn probleem en oplossing waren anders en ik dacht dat ik het hier moest posten, zodat toekomstige lezers hun hoofd niet tegen de muur kunnen stoten.

Ik wees verschillende xib toe aan dezelfde UIVIewController en zelfs na overal te hebben gezocht, kon ik niet vinden hoe ik dit moest corrigeren. Toen controleerde ik mijn AppDelegate waar ik initWithNibNameaan het bellen was en kan zien dat ik tijdens het kopiëren van de code de xib-naam heb gewijzigd, maar vergat de klasse UIViewControllerte wijzigen. Dus als geen van de oplossingen voor u werkt, controleer dan uw initWithNibName-methode.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes