presentViewController ve gezinme çubuğunu görüntüleme


102

Bir görünüm denetleyici hiyerarşim var ve en üstteki denetleyici kalıcı olarak görüntüleniyor ve kullanırken gezinme çubuğunun nasıl görüntüleneceğini bilmek istiyorum

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

'PresentViewController: animated: complete:' için dokümanlar not:

İPhone ve iPod touch'ta sunulan görünüm her zaman tam ekrandır. İPad'de sunum, modalPresentationStyle özelliğindeki değere bağlıdır. '

'ModalPresentationStyle' için dokümanlar şunu söylüyor:

Sunum stili, mod olarak sunulan bir görünüm denetleyicisinin ekranda nasıl görüntüleneceğini belirler. İPhone ve iPod touch'ta, kalıcı görünüm denetleyicileri her zaman tam ekran olarak sunulur, ancak iPad'de birkaç farklı sunum seçeneği vardır.

Görünüm kontrolü kendini gösterdiğinde, gezinme çubuğunun durum çubuğunun altında görünmesini sağlamanın bir yolu var mı? Dokümanı şu şekilde yorumlamalıyım, iPhone / iPod seçeneğiniz yok ve sadece iPad'de mi?

Önceden, 'UIViewController:presentModalViewController:animated'hangisinin iyi çalıştığını kullanıyordum , ancak iOS 5.0'dan beri API kullanımdan kaldırıldı, bu yüzden yenisine geçiyorum.

Görsel olarak, yapmak istediğim şey, eski API'nin yaptığı gibi, yeni denetleyicinin ekranın altından içeri kayması.

[kodla güncelleniyor]:

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

Yanıtlar:


193

İPhone'da modal olarak bir görünüm denetleyicisi sunarsanız, onu bir gezinme denetleyicisinin üstten görünüm denetleyicisinde veya başka bir şekilde nasıl gösterirseniz gösterin her zaman tam ekran sunulacağı doğrudur. Ancak gezinme çubuğunu her zaman aşağıdaki geçici çözüm yöntemiyle gösterebilirsiniz:

Bu görünüm denetleyicisini sunmak yerine, modsal olarak bir gezinme denetleyicisini, istediğiniz görünüm denetleyicisi olarak ayarlanan kök görünüm denetleyicisi ile birlikte sunun:

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

                        }];

Görünümünüz mod olarak sunulduğunda bir gezinme çubuğu görmelisiniz.


Başladığım şey buydu. Ancak 'presentModalViewController' kullanmamamın nedeni, kullanımdan kaldırılmış bir API olarak belirtilmiş olmasıdır.
Jonas Gardner

UIViewController sınıfında yazılan budur: // Başka bir görünüm denetleyicisini kalıcı alt öğe olarak görüntüle. Animasyonlu ise dikey bir sayfa geçişi kullanır. Bu yöntem, presentViewController ile değiştirildi: animated: complete: // Kullanımdan kaldırılacak, buna göre plan yap. - (void) presentModalViewController: (UIViewController *) modalViewController animasyonlu: (BOOL) animasyonlu; bu yüzden sadece yeni yöntemi çağırın ve tamamlanması için sıfırdan geçin ve iyi olmalısınız.
Manish Ahuja

Mükemmel cevap. Kullanılacak şekilde güncellendi(void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
Wayne

2
Bir gezinti denetleyicisi sunmaya çalıştığımda çöküyor ( 'NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported'). Bu nasıl işleyebilir?
oarfish

Benim durumumda çubuk gösteriyor ancak diğer içerik animasyon sunumuna yanlış yerleştirilmiş. Ve ancak bu animasyondan sonra doğru konuma atlar.
Vyachaslav Gerchicov

48

Swift 5.*

Navigasyon:

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

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

Geri gitmek:

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

Swift 2.0

Navigasyon:

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

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

Geri gitmek:

self.dismissViewControllerAnimated(true, completion: nil)

1
Ama kodunuzu denediğimde nasıl ayarlanır, o zaman sadece gezinme çubuğunu ayarlayın, ancak çubuk tonu rengi, başlık vb. Özelliklerini değiştiremiyorum.
Jaydip

Bu soruyla ilgili değil ama cevabını burada bulabilirsiniz stackoverflow.com/questions/26008536/…
Tal Zion

23

Kullana bilirmisin:

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

Geri dönmek (sanırım):

[self.navigationController popToRootViewControllerAnimated:YES];

3
Görsel senaryo taslağınızda zaten bir gezinme denetleyicisi tasarımınız varsa bunu yapmanın en iyi yolu teşekkür ederiz. Bana çok yardım ettin
phyzalis

geri dönüş [self.navigationController popViewControllerAnimated: YES]; popToRoot - 1. görüntü denetleyicisine geri dönüyor
Boris Gafurov

2

İos7'de de aynı sorunu yaşadım. Onu seçici olarak aradım ve hem ios7 hem de ios8'de çalıştı.

[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

[self.navigationController pushViewController:controller animated:YES];Yaptığı tek şey, bir geçişi canlandırmak ve onu gezinme denetleyicisi yığınına ve diğer bazı harika gezinme çubuğu animasyon öğelerine eklemektir. Eğer çubuk animasyonu umurumda değil, o zaman bu kod gerekir çalışır. Çubuk, yeni denetleyicide görünür ve etkileşimli bir pop hareketi elde edersiniz!

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

Düzenleme: Üzgünüz, presentViewController tam ekranı dolduracak. CGAffineTransform.translation veya başka bir şeyle özel bir geçiş yapmanız, denetleyiciyi geçişle canlandırmanız, ardından bunu navigationController'ın viewControllers'e eklemeniz gerekir.


1

Hızlı 3

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

Sunulan UIViewController'a GERİ düğmesi nasıl eklenir
zulkarnain shah

1

Swift sürümü: Bu, Gezinme Denetleyicisine yerleşik bir ViewController sunar.

    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

Bu kodu kullanıyorum. İOS 8'de iyi çalışıyor.

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

0

Bir çözüm

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 özelliğini (UIModalPresentationFormSheet gibi) ayarlamadıysanız, gezinme çubuğu her zaman görüntülenecektir. Emin olmak için her zaman yapın

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

Bu her zaman gezinme çubuğunu gösterecektir.


Hmm .. 'topViewController'a sabit referansla bile, aynı davranışı görüyorum. Diğer görünüm denetleyicilerini herhangi bir özel şekilde gezinme yığınına eklediğimi sanmıyorum.
Jonas Gardner

0

Swift 2.x'te NavigationController kullanıyorsanız

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

0

bunu dene

     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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.