6

私のMainViewControllerでは、これを介して別のView Controllerを提示します。

MessageViewController *messageController = [[MessageViewController alloc]initWithNibName:nil bundle:nil];

[messageController setModalPresentationStyle:UIModalPresentationFullScreen];
[messageController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];

[self presentViewController:messageController animated:YES completion:nil];

[messageController release];

これにより、View Controller が正しく表示されます。ただし、表示中のビュー コントローラー (この場合は ) に戻ろうとするとMainViewController、次のコードが機能しません。

if ([self.presentingViewController isKindOfClass:[MainViewController class]])
    [(MainViewController *)self.presentingViewController setCurrentViewTag:2];

[self dismissModalViewControllerAnimated:YES];

「if..」条件を削除して、現在のビュー タグを強制的に設定しました。エラーが発生し、表示中のビュー コントローラーは次のように思われますUINavigationController:

[UINavigationController setCurrentViewTag:]: unrecognized selector sent to instance 0x8352a50

なぜこれが起こっているのか誰にも教えてもらえますか?このコードは以前は機能していましたが、何が変更されて正しく機能しなくなったのかわかりません。

編集

更新されたコードは次のとおりです。

ReaderController *readerController = [[ReaderController alloc]initWithNibName:nil bundle:nil];
[readerController loadWhichViewToShow:2];

[self setDefinesPresentationContext:YES];

[readerController setModalPresentationStyle:UIModalPresentationFullScreen];
[readerController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];

[self presentViewController:readerController animated:YES completion:nil];

[readerController release];
4

3 に答える 3

14

呼び出し[self presentViewController:messageController animated:YES completion:nil];は、他のvcを提示するためにこれを呼び出すvcを必ずしも使用しません。デフォルトでは、vc-hierarchyを上に移動し、ルートビューコントローラに他のvcを表示します。そのため、あなたの場合、表示するViewControllerはUINavigationControllerです。

MainViewControllerを強制的に提示VCにする場合は、次の呼び出しを行います。

[self setDefinesPresentationContext:YES];

MessageViewControllerを表示する前に、MainViewControllerで。

編集:他の誰かがこれを読んだ場合:definesPresentationContextバグがあるか、ドキュメントが間違っているようです。以下のコメントとCocoaBuilderを参照してください

于 2012-10-29T09:25:11.290 に答える
6

この質問からの私の回答のコピー

Matt Neuburg による Programming iOS 6から:

iPad では、提示されたビュー コントローラーの modalPresentationStyle が UIModalPresentationCurrentContext の場合、どのビュー コントローラーを提示されたビュー コントローラーの presentingViewController にするかを決定する必要があります。これにより、提示されたView Controllerのビューによってどのビューが置き換えられるかが決まります。この決定には、別の UIViewController プロパティ、definePresentationContext (BOOL) が含まれます。presentViewController:animated:completion: が送信されたビュー コントローラーから始めて、親ビュー コントローラーのチェーンをたどって、 definePresentationContext プロパティが YES であるビュー コントローラーを探します。見つかったら、それがその 1 つです。それはpresentingViewControllerになり、そのビューは提示されたView Controllerのビューに置き換えられます。見つからなければ、

TL;DR
1.definesPresentationContext目的のデバイスで true にpresentingViewController
設定 2.目的のデバイスで truemodalPresentationStyleUIModalPresentationCurrentContext設定presentedViewController

于 2014-10-03T19:42:03.287 に答える