iPhone SDK Lös [UINavigationController pushViewController] okänd väljare skickad till exempel

Jag adore kodning till iPhone SDK. Det är den mest glada kodning jag har gjort under kvartalet (gasp!) Jag har spenderat kodning av olika datorsystem. Det är en kombination av Objective-C (elegant) och Kakao (vacker). Det finns ett undantag som jag fortsätter att få och bara sällan nog att jag glömmer varför jag får det. Jag trodde att någon skulle kunna dra nytta av detta eftersom det är en lätt fälla att falla in i.

Undantaget ifråga:

*** Avslutande app på grund av oavsett undantag "NSInvalidArgumentException", anledningen: '*** - [UINavigationController pushViewController:]: okänd väljare skickad till exempel 0x5255c0'

Om du använder navigeringsbaserad applikationsmall när du skapar ett nytt projekt får du en uppsättning projektfiler som får dig en bra bit i vägen mot en funktionell applikation. Faktum är att du kan slå bygg och gå och appen kommer att kompilera, springa och visa dig en vacker tabellvy. Du kommer förmodligen sedan lägga till kod för att visa tabellvisning i de celler som testas under vägen, och det kommer att fungera. Vid något tillfälle kanske du vill röra på cellerna öppna en ny vy. Mallen ger ett exempel på "didSelectRowAtIndexPath" som visas här:

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
// Navigationslogik kan gå här. Skapa och tryck på en annan bildkontroll.
// AnotherViewController * anotherViewController = [[AnotherViewController alloc] initWithNibName: @ "AnotherView" bunt: noll];
// [self.navigationController pushViewController: anotherViewController];
// [anotherViewController release];
}

Metoden själv är inte kommenterad, men alla instruktioner inom den är. Dessa kommenterade rader ger en aning om vad som ska hända. Linjen

[self.navigationController pushViewController: anotherViewController];

är nyckeln till både denna metods funktion och orsaken till felet. Den skjuter en ny bildkontroll på navigationsstacken och visar den, precis vad du vill att den ska göra. Om du inte kommenterar den här raden och justerar den för att använda den nya vynkontrollen du skapat får du en varning när du bygger den: "varning:" UINavigationController "svarar kanske inte på -pushViewController:" "Men bra , det här är en varning, inte ett fel. ÄH. Kör det dock, så får du felet som visas ovan, och okänd väljare skickad till en instans.

Om det du har läst hittills låter bekant, är den troliga lösningen enkel. Linjen ovanför den mall som Apple tillhandahållit är fel. Det finns i själva verket ingen meddelandesignatur för UINaigationController kallad -pushViewController: men det finns en som kallas -pushViewController: animerad: - Oj! Ledsen Apple! Vi älskar dig fortfarande. Mycket lätt att fixa, men om det händer efter en lång dag med kodning kan det orsaka otillbörlig frustration. Den korrigerade linjen ska se ut som:

[self.navigationController pushViewController: anotherViewController animated: YES];

Återuppbygga och detta fel kommer att lösas! Om det här var ditt problem. Om det inte var, varför inte förtvivlan. Dekryptering av undantagsmeddelanden är en del av den roliga delen av livsstilen för koddomen. En "okänd väljare" kommer fortfarande att referera till meddelandet du skickar "till exempel", något objekt som du har skapat. Undantaget berättar för oss vilken klass av objektet som mottar det konstiga meddelandet (UINavigationController i det här fallet) och meddelandet som skickades (pushViewController :). I det här fallet visste kompilatorn att det fanns något icky om meddelandet skickades, men det kan inte alltid vara möjligt att bestämma detta, så du kan inte lita på det. Du bör dock kunna söka efter din kod för meddelandet som rapporterats i undantaget från konsolloggen. Se till att allt är korrekt i den här raden, kontrollera dokumentationen för samtalets exakta karaktär.