2012-06-29 12 views
10

Jestem stosunkowo nowy w stosunku do Objective-C i pochodzę z tła Java, dlatego uważam, że pojęcie wskaźników i nie-dobrze objaśnionych błędów kompilacji jest dość zniechęcające.Uzyskiwanie dostępu do właściwości w pliku prepareForSegue elementu UIViewController

Mam klasę, która implementuje delegata z metodą jsonControllerDidLinkedInAuth. Ilekroć Delegator wysłać wiadomość do tej klasy, przekazując sobie i A (bibliotece NSURL *) URL próbuję przypisać url do nieruchomości authUrl, kiedy to operacje wykończenia nazywamy performSegueWithIdentifier, co z kolei sporządzi the prepareForSegue (o ile rozumiem to).

nie wydają się działać, jak ja odbierania:

App [3278: 13517] * kończące aplikację spowodowane nieprzechwyconego wyjątku 'NSInvalidArgumentException', rozum: „- [UINavigationController setUrlAddress :]: nierozpoznany selektor wysyłane do instancji 0x6acab00'

komunikat o błędzie, który kończy aplikację z SIGABRT.

Obie metody znajdują się w tej samej klasie, która jest kontrolerem UINavigationController i wskazuje na inny kontroler UINavigationController. Kompilator wskazuje mi, że druga metoda to [vc setUrlAddress:self.authUrl];.

- (void)jsonControllerDidLinkedInAuth:(JsonController *)controller :(NSURL *)url { 
    authUrl = url; 
    if (authUrl != nil) { 
     [self performSegueWithIdentifier:@"LinkedInAuth" sender:self]; 
    } else { 
     NSLog(@"Auth URL is null"); 
    } 
} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) { 
     // Get destination view 
     LinkedInViewController *vc = [segue destinationViewController]; 
     NSLog(@"The auth url from prepareForSegue in SignupViewControlle: %@", self.authUrl); 
     [vc setUrlAddress:self.authUrl]; 
    } 
} 

To, co wydaje się być problemem, to że z jakiegoś powodu nie mam dostępu do własności authUrl klasy I obecnie. Próbowałem z authUrl, [self authUrl] i self.authUrl, ale nic z tego nie działa. Właściwości są syntetyzowane, ale zauważyłem też małą podpowiedź: "UINavigationController setUrlAddress", czy nie powinien to być LinkedInViewController, jak zdefiniowano w powyższej metodzie? Próbowałem casting (LinkedInViewController) [segue destinationViewController], ale następnie pojawia się komunikat powiadamiający mnie, że nie można rzucić na wskaźnik.

Każda pomoc będzie bardzo ceniona. Dziękuje za przeczytanie.

Edytuj 1: NSLog tuż nad setUrlAddress zwraca self.authUrl. Zakładam, że musi to być jakiś problem z widocznością, ale nie jestem pewien, jak rozwiązać ten problem.

Odpowiedz

21

Jeśli kontroler widoku jest osadzony w kontrolerze UINavigationController, segue.destinationViewController odnosi się do tego kontrolera nawigacyjnego. To, co można użyć:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

     if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) { 
      UINavigationController *navigationController = (UINavigationController *)segue.destinationViewController; 
      LinkedInViewController *linkedInViewController = [[navigationController viewControllers] lastObject]; 
      linkedInViewController setUrlAddress:self.authUrl]; 
     } 
} 

A jeśli masz więcej niż 1 segue że przejścia do kontrolera widoku osadzonym w UINavigationController, zwykle dodać do początku prepareForSegue:sender:

if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]]) 
     id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject] 

Teraz vc zawiera kontroler widoku, który naprawdę Cię interesuje, więc nie musisz kopiować i wklejać castingu dla każdego segu.

+0

Dziękuję, działa to jak urok!Ponadto twoja wiadomość zaoszczędziła mi sporo debugowania, ponieważ istnieje niewiele innych kontrolerów ViewController, które zachowywałyby się w podobny sposób. –

+0

Nie ma za co. Zobacz moją zaktualizowaną odpowiedź, aby w łatwy sposób uzyskać dostęp do kontrolera widoku, który Cię interesuje, bez konieczności przesyłania za każdym razem. –

0

Wygląda na to, że nie przypisujesz delegata, który musisz wykonać, aby wzorzec delegatów działał. Spróbuj dodać vc.delegate = self do pliku prepareForSegue.

+0

Delegat został przypisany w innej metodzie, która zainicjowała uwierzytelnianie, a następnie delegator (nie pokazano w moich fragmentach kodu) o nazwie jsonControllerDidLinkedInAuth :, ale dziękuję i tak :) Mój problem był związany z osadzeniem mojego ViewController w kontrolerze NavigationController, jak wskazał przez Scotta. –

Powiązane problemy