web-dev-qa-db-ja.com

複数のモーダルビューコントローラーを提示しますか?

更新:
私は再びこの問題に直面し、別の方法を見つけました。プレゼンテーションコントローラーがナビゲーションコントローラーに埋め込まれていない場合、プレゼンテーションコントローラーがフルスクリーンでないと非表示になり、黒になります。メソッドsetModalPresentationStyle:UIModalPresentationCurrentContextは、ナビゲーションコントローラーにのみ適用できます。提示コントローラーをUINavigationControllerに埋め込み、UIModalPresentationCurrentContextをそれに設定して、新しいコントローラーを提示します-ダイアログコントローラーを取得します。

私は検索コントローラーを提示しています、それはスタック詳細コントローラーでプッシュするtableViewを持っています。

詳細なコントローラーは、ビューコントローラーにメッセージを表示できます。これは、小さなUIViewと半透明の背景で構成されます。

問題:最後に表示されたビューコントローラーが表示されると、その下にあるすべてのビューコントローラーが非表示になり、表示された検索コントローラーが表示されます。

ここで私がやっていること:

SearchViewController *viewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
viewController.data = dataArray;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
[self.navigationController presentViewController:navigationController animated:YES completion:nil];

テーブルが詳細ビューをプッシュするより:

DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[viewController setHidesBottomBarWhenPushed:YES];
viewController.dataItem = [data objectAtIndex:(NSUInteger) [indexPath row]];
[self.navigationController pushViewController:viewController animated:YES];

メッセージボックスを表示する詳細ビュー:

MessageController *controller = [[MessageController alloc] initWithNibName:@"MessageController" bundle:nil];
controller.message = message;
[self presentViewController:controller animated:YES completion:nil];

却下すると、その下のすべてのコントローラーが表示されます。

更新:

私が欲しかったのは、uitableviewを持つビューコントローラーをモーダルに表示することだけです。この表から、メッセージボックスを表示できる詳細ビューを表示します。メッセージボックスは別のビューコントローラーである必要があります。そして、メッセージボックスが表示されると、先行する2つのコントローラーがすべて消えます。それが問題です。

15
trickster77777

これを達成するための簡単な方法は、モーダルで表示したいVCを作成し、次々に表示することです。残念ながら、これはうまくいきません。あなたが得るものは、最初のVC提示されただけです、他のすべてはどこにも行きません。UIKitはここであなたと協力しません。

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
4
Gtx

状況によっては、モーダルで表示される各ビューコントローラに次のビューコントローラを表示させることができます。

let window = UIApplication.sharedApplication().keyWindow!
if let modalVC = window.rootViewController?.presentedViewController {
    modalVC.presentViewController(vc, animated: true, completion: nil)
} else {
    window.rootViewController!.presentViewController(vc, animated: true, completion: nil)
}
11
SlimeBaron

表示されたビューコントローラの上にあるすべてのビューコントローラを閉じます。

Appleのドキュメントは次のとおりです。

複数のビューコントローラーを連続して提示し、提示されたビューコントローラーのスタックを構築する場合、スタックの下位にあるビューコントローラーでこのメソッドを呼び出すと、その直接の子ビューコントローラーと、スタック上のその子より上のすべてのビューコントローラーが閉じます。これが発生すると、最上位のビューのみがアニメーション形式で閉じられます。中間のView Controllerはスタックから削除されるだけです。最上位のビューは、モーダル遷移スタイルを使用して閉じられます。これは、スタックの下にある他のビューコントローラーで使用されるスタイルとは異なる場合があります。

2つのモーダルビューコントローラーを閉じます。

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];

https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#jumpTo_51

10
Rei Kubonaga

この答えは少し型破りに思えるかもしれませんが、うまくいきます。 「複数のモーダルを開く」ことができますが、一度に1つしか表示されません。重要なのは、モーダルを1つだけにすることですが、Tab Bar Controllerを使用してView Controllers。

multiple modals

  1. モーダルセグエを青色(表示)View Controllerからモーダルコンテナー(これは通常のビュー)に配線しますコントローラー
  2. モーダルコンテナーは、コンテナービューのみを保持し、その唯一の目的は、タブバーコントローラー
  3. タブバーコントローラーコンテナビュー内に埋め込む
  4. 各タブは個別のView Controllerにすることができ、「複数のモーダル」を表します
  5. Tab Bar Controller 'sTab Barhidden
  6. _tabBarController?.selectedIndex = 1_を使用してモーダルを切り替える
  7. 通常はdismissViewControllerAnimated(true, completion: nil)でモーダルを閉じます

次のようになります。

enter image description here

8
Robert Chen

正しいmodalPresentationStyleboth the navigationController AND viewController自体に設定します。

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
vcToPresent.preferredContentSize = CGSizeMake(650, 450);

[self presentViewController:vcToPresent animated:YES completion:^{
    self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`
1
rizzes

私は解決策を見つけました:あなた自身のカスタムアニメーションを提供してください:

    let transition: CATransition = CATransition()
    transition.duration = 0.5
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = kCATransitionReveal
    transition.subtype = kCATransitionFromBottom
    self.view.window!.layer.add(transition, forKey: nil)
    self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)
0
Antzi