presentViewControllerとナビゲーションバーの表示


99

ビューコントローラーの階層があり、最上位のコントローラーがモーダルとして表示され、使用時にナビゲーションバーを表示する方法を知りたい

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

「presentViewController:animated:completion:」に関するドキュメントのメモ:

'iPhoneおよびiPod touchでは、表示されるビューは常にフルスクリーンです。iPadでは、プレゼンテーションはmodalPresentationStyleプロパティの値に依存します。

「modalPresentationStyle」の場合、ドキュメントは次のように述べています。

表示スタイルは、モーダルに表示されたビューコントローラが画面に表示される方法を決定します。iPhoneおよびiPod touchでは、モーダルビューコントローラーは常にフルスクリーンで表示されますが、iPadではいくつかの異なる表示オプションがあります。

ビューコントロールが表示されたら、ステータスバーの下にナビゲーションバーが表示されるようにする方法はありますか?ドキュメントを次のように解釈すると、iPhone / iPodのオプションが表示されず、iPadでのみ表示されますか?

以前'UIViewController:presentModalViewController:animated'はうまく機能していたものを使用していましたが、iOS 5.0以降、APIが廃止されたため、新しいAPIに切り替えています。

視覚的には、以前使用していた古いAPIと同じように、画面の下部から新しいコントローラーをスライドさせます。

[コードで更新]:

// My root level view:
UIViewController *vc = [[RootViewController alloc] 
                            initWithNibName:nil 
                            bundle:[NSBundle mainBundle]];
navController = [[UINavigationController alloc] initWithRootViewController:vc];        
....

// Within the RootViewController, Second view controller is created and added 
// to the hierarchy. It is this view controller that is responsible for 
// displaying the DetailView:
SecondTierViewController *t2controller = [[SecondTierViewController alloc] 
                                           initWithNibName:nil
                                           bundle:[NSBundle mainBundle]];

[self.navigationController pushViewController:t2controller animated:YES];

// Created by SecondTierViewController 
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

[self.navigationController presentViewController:controller 
                                        animated:YES 
                                        completion:nil];

回答:


193

iPhoneでビューコントローラーをモーダルで表示する場合、ナビゲーションコントローラーのトップビューコントローラーやその他の方法でどのように表示しても、常にフルスクリーンで表示されることは事実です。ただし、次の回避策の方法でいつでもナビゲーションバーを表示できます。

そのビューコントローラーをモーダルで表示するのではなく、ルートビューコントローラーを目的のビューコントローラーとして設定して、ナビゲーションコントローラーをモーダルで表示します。

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc] initWithRootViewController:myViewController];

//now present this navigation controller modally 
[self presentViewController:navigationController
                   animated:YES
                   completion:^{

                        }];

ビューがモーダルに表示されると、ナビゲーションバーが表示されます。


それは私が始めたものとほとんど同じです。しかし、「presentModalViewController」を使用していない理由は、廃止されたAPIとして記載されているためです。
Jonas Gardner

これは、UIViewControllerクラスで記述されたものです。//別のビューコントローラをモーダルな子として表示します。アニメーション化されている場合は、垂直方向のシート遷移を使用します。このメソッドはpresentViewController:animated:completionに置き換えられました://非推奨になるので、それに応じて計画してください。-(void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated; したがって、新しいメソッドを呼び出してnilを渡して完了すれば、問題はありません。
Manish Ahuja

すばらしい答えです。使用するために更新(void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
Wayne

2
ナビゲーションコントローラーを表示しようとすると、クラッシュします('NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported')。これはどのように機能しますか?
oarfish 2015

私の場合、それはバーを示していますが、他のコンテンツはアニメーションを提示する際に間違って配置されています。そして、このアニメーションの後にのみ、正しい位置にジャンプします。
Vyachaslav Gerchicov

45

Swift 5.*

ナビゲーション:

guard let myVC = self.storyboard?.instantiateViewController(withIdentifier: "MyViewController") else { return }
let navController = UINavigationController(rootViewController: myVC)

self.navigationController?.present(navController, animated: true, completion: nil)

戻る:

self.dismiss(animated: true, completion: nil)

Swift 2.0

ナビゲーション:

let myVC = self.storyboard?.instantiateViewControllerWithIdentifier("MyViewController");
let navController = UINavigationController(rootViewController: myVC!)

self.navigationController?.presentViewController(navController, animated: true, completion: nil)

戻る:

self.dismissViewControllerAnimated(true, completion: nil)

1
しかし、どのセットに私はセットナビゲーションバーだけにしてあなたのコードを試してみたが、私はバーの色合いの色のようにそのプロパティを変更できない場合、タイトルなど
Jaydip

この質問に関連していますが、ここで答えを見つけることができませんstackoverflow.com/questions/26008536/...
タルシオン

23

使える:

[self.navigationController pushViewController:controller animated:YES];

戻る(私は思う):

[self.navigationController popToRootViewControllerAnimated:YES];

3
ストーリーボードに既にナビゲーションコントローラーのデザインがある場合は、それを行うための最良の方法である、ありがとうございます。あなたは私をたくさん助けてくれました
phyzalis 2014年

戻るのは[self.navigationController popViewControllerAnimated:YES]です。popToRoot-最初のビューコントローラーに戻る
ボリス・ガフロフ

2

ios7でも同じ問題が発生しました。私はそれをセレクターで呼び出し、それはios7とios8の両方で動作しました。

[self performSelector: @selector(showMainView) withObject: nil afterDelay: 0.0];

- (void) showMainView {
    HomeViewController * homeview = [
        [HomeViewController alloc] initWithNibName: @
        "HomeViewController"
        bundle: nil];
    UINavigationController * navcont = [
        [UINavigationController alloc] initWithRootViewController: homeview];
    navcont.navigationBar.tintColor = [UIColor whiteColor];
    navcont.navigationBar.barTintColor = App_Theme_Color;
    [navcont.navigationBar
    setTitleTextAttributes: @ {
        NSForegroundColorAttributeName: [UIColor whiteColor]
    }];
    navcont.modalPresentationStyle = UIModalPresentationFullScreen;
    navcont.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.navigationController presentViewController: navcont animated: YES completion: ^ {

    }];
}

1

すべてのa [self.navigationController pushViewController:controller animated:YES];はトランジションをアニメーション化し、それをナビゲーションコントローラースタックに追加し、その他のクールなナビゲーションバーアニメーションの要素を追加します。バーのアニメーションを気にしない場合、このコード機能するはずです。新しいコントローラーにはバーが表示され、インタラクティブなポップジェスチャーが得られます。

//Make Controller
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                    bundle:[NSBundle mainBundle]];  
//Customize presentation
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

//Present controller
[self presentViewController:controller 
                   animated:YES 
                 completion:nil];
//Add to navigation Controller
[self navigationController].viewControllers = [[self navigationController].viewControllers arrayByAddingObject:controller];
//You can't just [[self navigationController].viewControllers addObject:controller] because viewControllers are for some reason not a mutable array.

編集:申し訳ありませんが、presentViewControllerは画面全体に表示されます。CGAffineTransform.translationなどでカスタム遷移を作成し、遷移でコントローラーをアニメーション化して、それをnavigationControllerのviewControllersに追加する必要があります。


1

スウィフト3

        let vc0 : ViewController1 = ViewController1()
        let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
        self.present(vc2, animated: true, completion: nil)

表示されたUIViewControllerに[戻る]ボタンを追加する方法
zulkarnain shah

1

Swiftバージョン:ナビゲーションコントローラーに埋め込まれたViewControllerを表示します。

    override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    //  Identify the bundle by means of a class in that bundle.
    let storyboard = UIStoryboard(name: "Storyboard", bundle: NSBundle(forClass: SettingsViewController.self))

    // Instance of ViewController that is in the storyboard.
    let settingViewController = storyboard.instantiateViewControllerWithIdentifier("SettingsVC")

    let navController = UINavigationController(rootViewController: settingViewController)

    presentViewController(navController, animated: true, completion: nil)

}

1

このコードを使用します。iOS 8では問題なく動作しています。

MyProfileEditViewController *myprofileEdit=[self.storyboard instantiateViewControllerWithIdentifier:@"myprofileeditSid"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myprofileEdit];
[self presentViewController:navigationController animated:YES completion:^{}];

0

1つのソリューション

DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
navController.modalPresentationStyle = UIModalPresentationCurrentContext;



[self.navigationController presentViewController:navController 
                                        animated:YES 
                                        completion:nil];

0

modalPresentationStyleプロパティを設定しなかった場合(UIModalPresentationFormSheetなど)、ナビゲーションバーは常に表示されます。確実にするために、常に

[[self.navigationController topViewController] presentViewController:vieController 
                                                            animated:YES 
                                                          completion:nil];

これにより、ナビゲーションバーが常に表示されます。


うーん..「topViewController」への固定参照があっても、私はまだ同じ動作を見ています。他のView Controllerを特別な方法でナビゲーションスタックに追加しているとは思いません。
Jonas Gardner、

0

Swift 2.xでNavigationControllerを使用する場合

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let targetViewController = storyboard.instantiateViewControllerWithIdentifier("targetViewControllerID") as? TargetViewController
self.navigationController?.pushViewController(targetViewController!, animated: true)

0

これを試して

     let transition: CATransition = CATransition()
    let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.duration = 1
    transition.timingFunction = timeFunc
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromRight
    self.view.window!.layer.addAnimation(transition, forKey: kCATransition)
    self.presentViewController(vc, animated:true, completion:nil)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.