presentViewController dan menampilkan bilah navigasi

99

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

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

Dokumen untuk 'presentViewController: animasi: penyelesaian:' catatan:

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

Untuk 'modalPresentationStyle', dokumen mengatakan:

Gaya presentasi menentukan bagaimana pengontrol tampilan yang disajikan secara sederhana ditampilkan di layar. Di iPhone dan iPod touch, pengontrol tampilan modal selalu disajikan dalam layar penuh, tetapi di iPad terdapat 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 sebagai, Anda tidak mendapatkan opsi iPhone / iPod dan hanya di iPad?

Sebelumnya, saya menggunakan 'UIViewController:presentModalViewController:animated'yang berfungsi dengan baik, tetapi sejak iOS 5.0, API sudah usang jadi saya beralih ke yang baru.

Secara visual, yang ingin saya lakukan adalah membuat pengontrol baru meluncur dari bawah layar, seperti yang biasa dilakukan API lama.

[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];
Jonas Gardner
sumber

Jawaban:

193

Memang benar bahwa jika Anda menyajikan pengontrol tampilan secara sederhana di iPhone, itu akan selalu disajikan layar penuh tidak peduli bagaimana Anda menyajikannya di pengontrol tampilan atas dari pengontrol navigasi atau cara lain. Tetapi Anda selalu dapat menampilkan bilah navigasi dengan cara penyelesaian berikut:

Daripada menyajikan pengontrol tampilan itu secara moduler menyajikan pengontrol navigasi secara modally dengan pengontrol tampilan root yang disetel 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 sederhana.

Manish Ahuja
sumber
Itulah yang saya mulai. Tetapi alasan saya tidak menggunakan 'presentModalViewController' adalah karena ini dicatat sebagai API yang tidak digunakan lagi.
Jonas Gardner
inilah yang telah ditulis di kelas UIViewController: // Tampilkan pengontrol tampilan lain sebagai anak modal. Menggunakan transisi lembar vertikal jika beranimasi. Metode ini telah diganti oleh presentViewController: animated: penyelesaian: // Ini akan DEPRECATED, rencanakan sesuai. - (void) presentModalViewController: (UIViewController *) animasi modalViewController: (BOOL) animasi; jadi cukup panggil metode baru dan berikan nol untuk penyelesaian dan Anda akan baik-baik saja.
Manish Ahuja
Jawaban yang bagus. Diperbarui untuk digunakan(void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
Wayne
2
Ketika saya mencoba menyajikan pengontrol navigasi, itu macet ( 'NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported'). Bagaimana cara kerjanya?
oarfish
Dalam kasus saya, ini menunjukkan bilah tetapi konten lain ditempatkan secara tidak benar saat menampilkan animasi. Dan hanya setelah animasi ini, ia melompat ke posisi yang benar.
Vyachaslav Gerchicov
46

Swift 5.*

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)
Tal Zion
sumber
1
Tetapi Bagaimana mengatur ketika saya mencoba kode Anda maka hanya mengatur bilah navigasi tetapi saya tidak dapat mengubah propertinya seperti warna warna batang, judul, dll.
Jaydip
Tidak terkait dengan pertanyaan ini, tetapi Anda dapat menemukan jawabannya di sini stackoverflow.com/questions/26008536/…
Tal Zion
23

Bisakah anda menggunakan:

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

Kembali (saya pikir):

[self.navigationController popToRootViewControllerAnimated:YES];
marrop
sumber
3
Terima kasih, cara terbaik untuk melakukannya jika Anda sudah memiliki desain pengontrol navigasi di storyboard Anda. Anda banyak membantu saya
phyzalis
kembali adalah [self.navigationController popViewControllerAnimated: YES]; popToRoot - kembali ke viewcontroller pertama
Boris Gafurov
2

Saya memiliki masalah yang sama di ios7. Saya menyebutnya di selector dan itu bekerja pada 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: ^ {

    }];
}
Mohammad Parvez
sumber
1

Yang [self.navigationController pushViewController:controller animated:YES];dilakukan hanyalah menganimasikan transisi, dan menambahkannya ke tumpukan pengontrol navigasi, dan beberapa barang animasi bilah navigasi keren lainnya. Jika Anda tidak peduli dengan animasi batang, maka kode ini akan berfungsi. Bilah memang 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 perlu membuat transisi khusus, dengan CGAffineTransform.translation atau semacamnya, menganimasikan pengontrol dengan transisi, lalu menambahkannya ke viewControllers navigationController.

Ignat
sumber
1

Cepat 3

        let vc0 : ViewController1 = ViewController1()
        let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
        self.present(vc2, animated: true, completion: nil)
BennyTheNerd
sumber
Cara menambahkan tombol KEMBALI ke UIViewController yang disajikan
zulkarnain shah
1

Versi Swift: Ini menyajikan ViewController yang disematkan di Pengontrol 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)

}
ioopl
sumber
1

Saya menggunakan kode ini. Ini berfungsi dengan baik di iOS 8.

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

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];
Yatin Sarbalia
sumber
0

Jika Anda tidak menyetel properti modalPresentationStyle (seperti 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.

rakeshNS
sumber
Hmm..bahkan dengan referensi tetap ke 'topViewController', saya masih melihat perilaku yang sama. Saya tidak berpikir saya menambahkan pengontrol tampilan lain ke tumpukan nav dengan cara khusus apa pun.
Jonas Gardner
0

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)
Ego Slayer
sumber
0

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)
tsinghan
sumber