2

「問題なく」動作していたいくつかのモーダル ビューがあり、現在は親ビュー コントローラーに戻るのをやめ、「コードは変更されていません」。-- 古典的な問題の説明。

モーダル ビューの非表示をデバッグしましたが、親ビュー コントローラーは nil です。これは問題を説明していますが、原因は説明していません。SDK を 4.1.2 から 4.2 にアップグレードしたので、iOS 5 での作業を開始できます。新しいメモリ管理 ARC と、自動解放と保持/解放の私のスタイルに疑いがあります。

以下は、ルートビュー コントローラーから AboutViewController へのコードです。

- (IBAction)doInfo:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    AboutViewController *aboutViewController = [[[AboutViewController alloc] initWithNibName:@"AboutViewController" bundle:[NSBundle mainBundle]] autorelease];
    if (aboutViewController) {
        aboutViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        aboutViewController.hidesBottomBarWhenPushed = YES;
        self.navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        self.navigationController.navigationBarHidden = YES;
        [self presentModalViewController:aboutViewController animated:YES];
    }
}

以下は、「完了」ボタンを押した後、AboutViewController を閉じてその親に戻します。

- (IBAction)doDone:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    [[self parentViewController] dismissModalViewControllerAnimated:YES];
}

わかりました...次のように変更して修正しました。問題は、なぜこれが以前に機能したのかということです。

- (IBAction)doDone:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    [self dismissModalViewControllerAnimated:YES];
}
4

2 に答える 2

6

プロパティについて[1]から引用parentViewController

iOS 5.0より前では、ビューに親View Controllerがなく、モーダルで表示されていた場合、それを表示していたViewControllerが返されていました。これはもはや当てはまりません。presentingViewControllerプロパティを使用して、presentingviewコントローラーを取得できます。

したがって、これにより、これが以前は機能し、現在は機能しない理由の問題が解決されます。iOS 5用にビルドする場合は、presentingViewControllerプロパティを使用します。これは、ドキュメントで親ビューコントローラー(またはこの場合は表示)にモーダルビューを閉じさせるようにアドバイスされているためです。ただし、iOS 4および5用にビルドする場合は、とにかく適切なView Controllerに呼び出しを転送するため、コードを配置します。

いずれにせよ、アプリが再コンパイルする前にiOS 5で問題なく実行された場合、AppleはiOS5より前にコンパイルされたアプリの古い動作を模倣するランタイムトリックを配置したと思います。

[1] http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

于 2011-11-28T20:52:09.973 に答える
1

presentingViewControlleriOS 4に追加するカテゴリを作成しました。

iOS 5 では自動的に無効になります。

シームレスに使用できます。後方モーダルを参照してください。

これが私と同じくらいあなたに利益をもたらすことを願っています。それはあなたのコードをよりきれいにします!

于 2012-03-22T06:30:33.817 に答える