10

私はObjective-Cに比較的慣れておらず、Javaのバックグラウンドを持っているので、ポインターの概念と、十分に説明されていないコンパイルエラーは非常に気が遠くなります。

jsonControllerDidLinkedInAuthメソッドを使用してデリゲートを実装するクラスがあります。委任者がこのクラスにメッセージを送信し、それ自体と(NSURL *)urlを渡すときはいつでも、この操作が終了したときにプロパティauthUrlにURLを割り当てようとしています。これにより、performSegueWithIdentifierが呼び出され、prepareForSegueが実行されます(これについての私の理解が懸念されます)。

私が受け取っているので、これはうまくいかないようです:

App [3278:13517] *キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:'-[UINavigationController setUrlAddress:]:認識されないセレクターがインスタンス0x6acab00に送信されました'

SIGABRTでアプリケーションを終了するエラーメッセージ。

両方のメソッドは同じクラスにあります。これはUINavigationControllerであり、別のUINavigationControllerを指します。コンパイラ[vc setUrlAddress:self.authUrl];は、2番目のメソッドのを指摘します。

- (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を返します。なんらかの視認性の問題だと思いますが、どうやって解決したらいいのかわかりません。

4

2 に答える 2

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に埋め込まれたView Controllerに移行するセグエが複数ある場合は、通常、これを次の先頭に追加しprepareForSegue:senderます。

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

これvcで、実際に関心のあるView Controllerが含まれるため、セグエごとにキャストをコピーして貼り付ける必要はありません。

于 2012-06-29T19:24:34.897 に答える
0

デリゲートを割り当てているようには見えません。デリゲートパターンを機能させるには、これを行う必要があります。vc.delegate = selfprepareForSegueに追加してみてください。

于 2012-06-29T19:42:32.337 に答える