2012-06-29 19 views
10

Nesne-C'ye nispeten yeni geliyorum ve Java arka planından geliyorum, bu yüzden işaretçilerle ilgili kavramları buldum ve iyi açıklanmayan derleme hatalarını oldukça göz ardı ediyorum.Bir UIViewController dosyasının hazırlığıAçıklama

jsonControllerDidLinkedInAuth yöntemiyle bir temsilci uygulayan bir sınıfım var. delegator kendisini ve (NSURL *) url geçirerek, bu sınıfa mesaj göndermek zaman, bu işlemleri bitirir performSegueWithIdentifier, dediğimiz bir özellik authUrl e url atamak çalışıyorum hangi dönüş yürütür içinde prepareForSegue (bunun hakkında benim anlayışım söz konusu olduğu sürece). nedeniyle yakalanmamış istisna 'NSInvalidArgumentException', akıl uygulamayı sonlandırılması *:

App [13517 3278:]: Ben alıyorum olarak

Bu

, çalışmak için görünmüyor '- [UINavigationController setUrlAddress :]: tanınmayan seçici örneği 0x6acab00' SIGABRT uygulamayı sonlandırır

hata mesajı gönderilir.

Her iki yöntem de UINavigationController olan ve başka bir UINavigationController'ı işaret eden aynı sınıfta yer alır. Derleyici, ikinci yöntemin [vc setUrlAddress:self.authUrl]; işaret ediyor.

- (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]; 
    } 
} 

Sorun şu ki, şu anki sınıfın authUrl özelliğine erişemiyorum. AuthUrl, [self authUrl] ve self.authUrl ile çalıştım ama bunların hiçbiri işi yapmıyor gibi görünüyor. Özellikler sentezlenir, ancak küçük bir ipucu da fark ettim: "UINavigationController setUrlAddress", yukarıdaki metodda tanımlandığı gibi bir LinkedInViewController olması gerekmez mi? Ben casting (LinkedInViewController) [segue destinationViewController] denedim, ama sonra bana bir işaretçi üzerine döküm edemediğinizi bildiren bir mesaj alıyorum.

Herhangi bir yardım çok takdir edilecektir. Okuduğunuz için teşekkürler.

Düzenleme 1: setUrlAddress'in hemen üstündeki NSLog, self.authUrl değerini döndürür. Bir çeşit görünürlük problemi olması gerektiğini düşünüyorum ama bunu nasıl çözeceğimi bilmiyorum.

cevap

21

Görünüm denetleyiciniz bir UINavigationController'a gömülü ise, segue.destinationViewController bu gezinme denetleyicisine başvurur.

- (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]; 
     } 
} 

Ve eğer bir UINavigationController gömülü bir görünüm denetleyicisi geçişler 1'den fazla segue varsa, ben genellikle prepareForSegue:sender başına bu ekleyin::

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

Bu kullanabilirsiniz şeydir Şimdi vc, aslında ilgilendiğiniz görünüm denetleyicisini içerir, bu nedenle her segue için döküm işlemini kopyalayıp yapıştırmanız gerekmez.

+0

Teşekkür ederim, bu bir çekicilik gibi çalışır!Ayrıca, benzer bir şekilde davranacak başka ViewControllers var olduğundan, mesajınız bana çok fazla hata ayıklama yaptı. –

+0

Rica ederim. Her defasında yayınlanmak zorunda kalmadan ilgilenen görünüm denetleyicisine erişmenin kolay bir yolu için güncellenmiş yanıtımı görün. –

0

Temsilci deseninin çalışması için yapmanız gereken temsilci atamak gibi görünmüyor. PrepareForSegue öğenize vc.delegate = self eklemeyi deneyin.

+0

Temsilci, kimlik doğrulamayı başlatan başka bir yöntemde atandı, sonra jsonControllerDidLinkedInAuth: adlı delegator (kod parçacıklarımda gösterilmiyor), ama yine de teşekkürler :) Sorunum, ViewController'ın bir NavigationController'a gömülü olarak işaretlenmiş olmasıyla ilgili idi. Scott tarafından dışarı. –

İlgili konular