2012-06-29 4 views
10

私はObjective-Cには比較的新しく、Javaのバックグラウンドから来ているので、ポインタの概念はわかりません。UIViewControllerのprepareForSegueのプロパティへのアクセス

私はjsonControllerDidLinkedInAuthメソッドでデリゲートを実装するクラスを持っています。 委任は、自身と(NSURL *)URLを渡して、このクラスにメッセージを送信するたびに、私はこの操作が終了するとperformSegueWithIdentifierを、呼び出しプロパティauthUrlURLを割り当てるしようとしていたターンが実行中prepareForSegue(これについての私の理解の限り)。

私は受け付けており、これは、動作していないよう:「 - [UINavigationController setUrlAddress:キャッチされない例外により 'NSInvalidArgumentException'、理由にアプリを終了*

のApp [13517 3278]を:]:認識されないセレクターインスタンス0x6acab00' SIGABRTでアプリケーションを終了

エラーメッセージに送られます。

どちらのメソッドも同じクラスにあります。これはUINavigationControllerであり、別のUINavigationControllerを指しています。コンパイラは、2番目の方法の[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]; 
     } 
} 

そして、あなたはUINavigationControllerに埋め込まれたビューコントローラに遷移より1つのセグエを持っている場合、私は通常prepareForSegue:senderの先頭にこれを追加します:これは、あなたが使うことができるものである

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

今度はvcに実際に興味のあるビューコントローラが含まれているので、すべてのセグのキャストをコピーアンドペーストする必要はありません。

+0

ありがとう、これは魅力のように機能します!また、同様の方法で動作する他のViewControllerもほとんどないので、メッセージでデバッグが大幅に節約されました。 –

+0

ようこそ。毎回キャストすることなく、興味のあるView Controllerに簡単にアクセスできるように、私の更新された回答をご覧ください。 –

0

デリゲートパターンを機能させるためには、デリゲートを割り当てる必要はありません。 prepareForSegueにvc.delegate = selfを追加してみてください。

+0

デリゲートは、認証を開始した別のメソッドで割り当てられ、デリゲーター(コードスニペットには表示されません)がjsonControllerDidLinkedInAuth:と呼びますが、とにかく感謝します:)私の問題は、NavControllerにNavControllerに埋め込まれていますスコットによって –

関連する問題