Pertanyaan presentViewController dan menampilkan bilah navigasi


Saya memiliki hierarki pengontrol tampilan dan pengontrol teratas ditampilkan sebagai modal dan ingin tahu cara menampilkan bilah navigasi saat menggunakan

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

Dokumen untuk 'presentViewController: animated: completion:' note:

'Pada iPhone dan iPod touch, tampilan yang disajikan selalu layar penuh.   Di iPad, presentasi tergantung pada nilai dalam   properti modalPresentationStyle. '

Untuk 'modalPresentationStyle', dokumen mengatakan:

Gaya presentasi menentukan bagaimana pengontrol tampilan yang disajikan secara digital ditampilkan di layar. Pada iPhone dan iPod touch, pengendali moda selalu disajikan layar penuh, tetapi di iPad ada beberapa opsi presentasi yang berbeda.

Adakah cara untuk memastikan bahwa bilah navigasi terlihat di bawah bilah status setelah kontrol tampilan ditampilkan sendiri? Haruskah saya menafsirkan dokumen itu sebagai, Anda tidak mendapatkan opsi iPhone / iPod dan hanya di iPad?

Sebelumnya, saya menggunakan 'UIViewController:presentModalViewController:animated' yang berfungsi dengan baik, tetapi karena iOS 5.0, API sudah tidak digunakan lagi jadi saya beralih ke yang baru.

Secara visual, yang ingin saya lakukan adalah memindahkan pengontrol baru dari bagian bawah layar, seperti API lama yang digunakan.

[memperbarui dengan kode]:

// 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];

75
2018-03-15 16:41


asal


Jawaban:


Memang benar bahwa jika Anda menyajikan pengontrol tampilan secara manual pada iPhone, itu akan selalu disajikan layar penuh tidak peduli bagaimana Anda menyajikannya di pengontrol tampilan atas pengontrol navigasi atau sebaliknya. Tetapi Anda selalu dapat menampilkan bilah navigasi dengan cara ini:

Daripada menampilkan pengontrol tampilan itu, modalnya menghadirkan pengendali navigasi secara moduler dengan pengontrol tampilan akar-nya sebagai pengontrol tampilan yang Anda inginkan:

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:^{

                        }];

Anda akan melihat bilah navigasi saat tampilan Anda disajikan secara moduler.


170
2018-03-15 18:18



Swift 3.0 / 4.0

Navigasi:

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

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

Akan kembali:

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

Swift 2.0

Navigasi:

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

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

Akan kembali:

self.dismissViewControllerAnimated(true, completion: nil)

25
2018-03-13 17:56



Bisakah Anda menggunakan:

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

Kembali (saya pikir):

[self.navigationController popToRootViewControllerAnimated:YES];

22
2018-04-06 20:01



Semua a [self.navigationController pushViewController:controller animated:YES]; Apakah ini menghidupkan transisi, dan menambahkannya ke stack controller navigasi, dan beberapa hal animasi bar navigasi keren lainnya. Jika Anda tidak peduli tentang animasi bar, maka kode ini harus kerja. Bilah tidak muncul di pengontrol baru, dan Anda mendapatkan gerakan pop interaktif!

//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.

Edit: Maaf, presentViewController akan mengisi layar penuh. Anda akan perlu membuat transisi khusus, dengan CGAffineTransform.translation atau sesuatu, menghidupkan pengendali dengan transisi, lalu menambahkannya ke viewControllers navigationController.


1
2017-08-21 16:54



Saya memiliki masalah yang sama di iOS7. Saya menyebutnya di pemilih dan bekerja baik di ios7 dan 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
2018-06-29 16:30



Swift 3

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

1
2017-11-04 16:57



Satu solusi

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
2018-03-15 18:09



Jika Anda tidak mengatur properti modalPresentationStyle (seperti ke UIModalPresentationFormSheet), bilah navigasi akan selalu ditampilkan. Untuk memastikan, selalu lakukan

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

Ini akan selalu menampilkan bilah navigasi.


0
2018-03-15 17:16



Jika Anda menggunakan NavigationController di Swift 2.x

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

0
2017-08-07 06:53



coba ini

     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)

0
2017-08-17 05:24



Versi Swift: Ini menyajikan ViewController yang tertanam dalam Kontroler Navigasi.

    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)

}

0
2017-10-01 19:22