presentViewController und Anzeige der Navigationsleiste

99

Ich habe eine Ansichts-Controller-Hierarchie und der oberste Controller wird als Modal angezeigt und möchte wissen, wie die Navigationsleiste bei Verwendung angezeigt wird

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

Die Dokumente für 'presentViewController: animiert: Vervollständigung:' Hinweis:

'Auf dem iPhone und iPod touch ist die dargestellte Ansicht immer im Vollbildmodus. Auf dem iPad hängt die Präsentation vom Wert in der Eigenschaft modalPresentationStyle ab. '

Für 'modalPresentationStyle' sagen die Dokumente:

Der Präsentationsstil bestimmt, wie ein modal präsentierter Ansichts-Controller auf dem Bildschirm angezeigt wird. Auf dem iPhone und iPod touch werden Modal View Controller immer im Vollbildmodus angezeigt. Auf dem iPad gibt es jedoch verschiedene Präsentationsoptionen.

Gibt es eine Möglichkeit, um sicherzustellen, dass die Navigationsleiste unterhalb der Statusleiste sichtbar ist, sobald sich das Ansichtssteuerelement selbst anzeigt? Sollte ich das Dokument so interpretieren, dass Sie keine Optionen für iPhone / iPod und nur für iPad erhalten?

Früher habe ich verwendet, 'UIViewController:presentModalViewController:animated'was gut funktioniert hat, aber seit iOS 5.0 ist die API veraltet, sodass ich auf die neue umsteige.

Visuell möchte ich, dass der neue Controller vom unteren Bildschirmrand eingeblendet wird, genau wie die alte API.

[Aktualisierung mit Code]:

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

Antworten:

193

Wenn Sie einen Ansichts-Controller modal auf dem iPhone präsentieren, wird er zwar immer im Vollbildmodus angezeigt, unabhängig davon, wie Sie ihn auf dem Draufsicht-Controller eines Navigations-Controllers oder auf andere Weise präsentieren. Sie können die Navigationsleiste jedoch immer mit der folgenden Problemumgehung anzeigen:

Anstatt diesen Ansichts-Controller modal darzustellen, stellen Sie einen Navigations-Controller modal dar, wobei der Root-Ansichts-Controller als der gewünschte Ansichts-Controller festgelegt ist:

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

                        }];

Sie sollten eine Navigationsleiste sehen, wenn Ihre Ansicht modal dargestellt wird.

Manish Ahuja
quelle
Damit habe ich angefangen. Der Grund, warum ich 'presentModalViewController' nicht verwende, ist, dass es als veraltete API vermerkt ist.
Jonas Gardner
Dies wurde in der UIViewController-Klasse geschrieben: // Einen anderen Ansichts-Controller als modales untergeordnetes Element anzeigen. Verwendet einen vertikalen Blattübergang, wenn animiert. Diese Methode wurde durch presentViewController ersetzt: animiert: Vervollständigung: // Sie wird VERRINGERT. Planen Sie entsprechend. - (void) presentModalViewController: (UIViewController *) modalViewController animiert: (BOOL) animiert; Rufen Sie einfach die neue Methode auf und übergeben Sie nil zum Abschluss, und Sie sollten gut sein.
Manish Ahuja
Gute Antwort. Aktualisiert, um zu verwenden(void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
Wayne
2
Wenn ich versuche, einen Navigationscontroller zu präsentieren, stürzt dieser ab ( 'NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported'). Wie kann das funktionieren?
Oarfish
In meinem Fall wird die Leiste angezeigt, aber der andere Inhalt wird beim Präsentieren der Animation falsch platziert. Und erst nach dieser Animation springt es in die richtige Position.
Vyachaslav Gerchicov
45

Swift 5.*

Navigation:

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

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

Zurück gehen:

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

Swift 2.0

Navigation:

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

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

Zurück gehen:

self.dismissViewControllerAnimated(true, completion: nil)
Tal Zion
quelle
1
Aber wie man setzt, wenn ich Ihren Code versuche, dann setze ich nur die Navigationsleiste, aber ich kann ihre Eigenschaft wie
Balkentönungsfarbe
Nicht im Zusammenhang mit dieser Frage, aber Sie können die Antwort hier finden stackoverflow.com/questions/26008536/…
Tal Zion
23

Kannst du --- benutzen:

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

Zurück (glaube ich):

[self.navigationController popToRootViewControllerAnimated:YES];
marrop
quelle
3
Vielen Dank, der beste Weg, dies zu tun, wenn Sie bereits ein Navigationscontroller-Design in Ihrem Storyboard haben. Du hast mir sehr geholfen
Phyzalis
Zurück ist [self.navigationController popViewControllerAnimated: YES]; popToRoot - geht zurück zum 1. Viewcontroller
Boris Gafurov
2

Ich hatte das gleiche Problem auf ios7. Ich habe es im Selektor aufgerufen und es hat sowohl auf ios7 als auch auf ios8 funktioniert.

[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
quelle
1

Alles, [self.navigationController pushViewController:controller animated:YES];was Sie tun müssen, ist, einen Übergang zu animieren und ihn dem Navigationscontrollerstapel und einigen anderen coolen Animationsmaterialien für die Navigationsleiste hinzuzufügen. Wenn Sie nicht über die Bar Animation kümmern, dann ist dieser Code sollte funktionieren. Die Leiste erscheint auf dem neuen Controller und Sie erhalten eine interaktive Pop-Geste!

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

Bearbeiten: Sorry, presentViewController füllt den gesamten Bildschirm aus. Sie müssen einen benutzerdefinierten Übergang mit CGAffineTransform.translation oder etwas anderem durchführen, den Controller mit dem Übergang animieren und ihn dann zu den viewControllern des Navigationscontrollers hinzufügen.

Ignat
quelle
1

Swift 3

        let vc0 : ViewController1 = ViewController1()
        let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
        self.present(vc2, animated: true, completion: nil)
BennyTheNerd
quelle
So fügen Sie dem präsentierten UIViewController
zulkarnain shah
1

Schnelle Version: Hier wird ein ViewController vorgestellt, der in einen Navigationscontroller eingebettet ist.

    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
quelle
1

Ich benutze diesen Code. Es funktioniert gut in iOS 8.

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

Eine Lösung

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
quelle
0

Wenn Sie die Eigenschaft modalPresentationStyle nicht festgelegt haben (wie bei UIModalPresentationFormSheet), wird die Navigationsleiste immer angezeigt. Um dies sicherzustellen, immer tun

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

Dadurch wird immer die Navigationsleiste angezeigt.

rakeshNS
quelle
Hmm ... selbst mit dem festen Verweis auf 'topViewController' sehe ich immer noch das gleiche Verhalten. Ich glaube nicht, dass ich die anderen View Controller auf besondere Weise zum Navi-Stack hinzufüge.
Jonas Gardner
0

Wenn Sie NavigationController in Swift 2.x verwenden

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

Versuche dies

     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
quelle