2011-12-15 10 views
10

Oto jak pokażę UIAlertView i clickedButtonAtIndex delegata -ARC i UIAlertView: nierozpoznany selektor wysyłane do instancji

UIAlertView *alert = 
    [[UIAlertView alloc] initWithTitle: @"title" 
           message: @"message" 
           delegate: self 
        cancelButtonTitle: @"Cancel" 
        otherButtonTitles: @"Continue", nil]; 

    [alert show]; 


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    //something 
} 

Ten fragment kodu działa doskonale bez ARC. Ale z ARC zgłasza ten błąd - Zakończenie aplikację spowodowane nieprzechwyconego wyjątku „NSInvalidArgumentException”, powód: „- [__ NSCFType alertView: clickedButtonAtIndex:]: selektor nierozpoznany wysyłane do instancji 0x859d790”

Wszelkie pomysły, dlaczego delegat jest rzucanie ten błąd?

+1

Sam delegat jest zwalniany. Jak budujesz i zarządzasz tym obiektem? –

+1

@FirozeLafeer - obiekt, który wywoływał ten fragment kodu, tj. Self, został zwolniony przez ARC. Zrobiłem to jako własność i teraz wydaje się działać. Dzięki :) – arank

Odpowiedz

13

Twój delegat został zwolniony. Dokładnie sprawdź kod, aby upewnić się, że obiekt, który pokazuje alert i ustawia się jako delegat, jest w jakiś sposób zachowany (np. Coś w aplikacji ma do niego silne odniesienie).

+0

to był rzeczywiście mój problem, który po tym poście zdałem sobie sprawę, ponieważ został skopiowany przycisk w storyboardie, który wciąż miał metodę dołączoną, która dealloc'd viewController. W związku z tym moja druga metoda, która została poprawnie wywołana i wykonana, nie mogła wykonać zadań w ramach opcji theclickedButtonAtIndex. Mam nadzieję, że to pomaga komuś, dzięki za rozwiązanie! –

+0

Wyszukaj również CocoaPods dla UIAlertView, a znajdziesz wiele dodatków blokowych, które uprościją korzystanie z UIAlertView i wyeliminują potrzebę użycia UIAlertViewDelegate w kontrolerach widoku. –

0

Podobnie może się zdarzyć, jeśli zapomnisz zero na końcu po ostatnim otherButtonTitles parametru:

delegate: self cancelButtonTitle: @"No" otherButtonTitles: @"Yes",nil]; // don't forget the nil at the end here! (or it will crash first run)

Co ciekawe to wywala tylko przy pierwszym uruchomieniu aplikacji. Potem działa dobrze.

Powiązane problemy