2012-06-29 108 views
10

我對Objective-C比較陌生,而且我來自Java背景,因此我發現指針的概念並沒有很好地解釋編譯錯誤相當艱鉅。在UIViewController的prepareForSegue中訪問屬性

我有一個類實現與jsonControllerDidLinkedInAuth方法的委託。每當委託將消息發送到這個類中,通過自身和(NSURL *)網址,我想給網址分配給屬性authUrl,當這個操作完成後調用performSegueWithIdentifier,進而執行prepareForSegue(就我的理解而言)。

這似乎並沒有工作,因爲我收到一個:

應用[3278:13517] *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是:「 - [UINavigationController的setUrlAddress :]:無法識別的選擇發送到實例0x6acab00'

SIGABRT終止應用程序

錯誤消息。

這兩種方法都駐留在同一個類中,該類是UINavigationController並指向另一個UINavigationController。編譯器將我指向第二種方法的[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]; 
    } 
} 

什麼似乎是問題是,由於某種原因,我無法訪問我現在是類的authUrl屬性。我嘗試了authUrl,[self authUrl]和self.authUrl,但這似乎沒有任何工作。 屬性是綜合的,但我也注意到了一點點提示:「UINavigationController setUrlAddress」,不應該像LinkedInViewController那樣定義上面的方法嗎?我嘗試投射(LinkedInViewController)[segue destinationViewController],但後來我收到一條消息,通知我不能投射到指針上。

任何幫助將不勝感激。謝謝閱讀。

編輯1:剛好在setUrlAddress之上的NSLog確實返回self.authUrl。我假設它必定是某種可見性問題,但我不知道如何解決這個問題。

回答

21

如果您的視圖控制器嵌入到UINavigationController中,則segue.destinationViewController引用該導航控制器。這是你可以使用什麼:

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

如果你有超過1個SEGUE過渡至嵌入在一個UINavigationController視圖控制器,我通常將它添加到的prepareForSegue:sender開頭:

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

現在,vc包含您實際感興趣的視圖控制器,因此您無需複製並粘貼每個賽段的投射。

+0

謝謝,這個作品就像一個魅力!此外,您的消息爲我節省了很多調試時間,因爲很少有其他ViewController會以類似的方式運行。 –

+0

不客氣。查看我更新的答案,以便您輕鬆訪問您感興趣的視圖控制器,而無需每次都投入。 –

0

它看起來並不像你在分配委託,你需要這樣做才能讓委託模式起作用。嘗試將vc.delegate = self添加到您的prepareForSegue中。

+0

委託在另一個啓動身份驗證的方法中進行了分配,然後委託人(未在我的代碼片段中顯示)調用jsonControllerDidLinkedInAuth :,但無論如何感謝您:)我的問題與將ViewController嵌入NavigationController中相關,由斯科特出來。 –