Legen Sie rootViewController von UINavigationController mit einer anderen Methode als initWithRootViewController fest


75

Wie setze ich das rootViewControllervon UINavigationControllermit einer anderen Methode als initWithRootViewController?

Ich möchte initWithNavigationBarClass:toolbarClass:eine benutzerdefinierte Symbolleiste für meinen NavigationController bereitstellen, daher glaube ich nicht, dass ich sie verwenden kann initWithRootViewController.


Ein Ansatz, den ich gerade entdeckt habe, ist: [navigationController setViewControllers: [NSArray arrayWithObject: (Zeiger auf View Controller, der der Root View Controller sein sollte)]]; ist das der beste Weg? Ich gehe davon aus, dass Sie dies nur in der AppDelegate-Datei bei der didFinishLaunching-Delegatmethode aufrufen sollten, da es danach riskant erscheint, mit dem View-Controller-Array von
UINavigationController herumzuspielen

Antworten:


142

Sie können dies lösen, indem Sie anrufen setViewControllers.

So was:

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:[UIToolbar class]];

[navigationController setViewControllers:@[yourRootViewController] animated:NO];

Schnelle Version:

let navigationController = UINavigationController(navigationBarClass: MyNavigationBar.self, toolbarClass: UIToolbar.self)

navigationController.setViewControllers([yourRootViewController], animated: false)

Danke für die Bestätigung. Dies muss möglicherweise in einer separaten Frage behandelt werden, aber ich gehe davon aus, dass initWithNav .. bedeutet, dass alle meine Symbolleisten das gleiche Erscheinungsbild haben, das ich in der benutzerdefinierten Unterklasse festgelegt habe. Wie habe ich dann verschiedene Symbolleisten für verschiedene Abschnitte meiner App? Gebe ich verschiedene Symbolleisten aus dieser benutzerdefinierten Unterklasse zurück? Oder gibt es einen besseren Ansatz?
DRC

Dafür können Sie es verwenden navigationController.navigationBar.tintColor = [UIColor blackColor];oder wie auch immer Sie es in den -(void)viewDidAppear:animated:Methoden Ihrer ViewController
Leon Lucardie

Dies würde also die Tatsache überschreiben, dass ich in meiner UIToolBar-Unterklasse drawRect überschreibe und einen benutzerdefinierten Hintergrund einstelle? So implementiere ich Folgendes: UIImage * backgroundImage = [UIImage imageNamed: @ "UIToolBar_Background.png"]; [backgroundImage drawInRect: CGRectMake (0, 0, self.frame.size.width, self.frame.size.height)];
DRC

Ich bin nicht sicher, ob es so viel wie eine drawRectAnpassung überschreibt , aber es ist die Standardmethode zum Überschreiben der UIToolbarEigenschaften von a UINavigationController.
Leon Lucardie

Jede Idee zu dieser Folgefrage, die ich zu einem Problem gepostet habe, auf das ich stoße. stackoverflow.com/questions/16215981/…
drc

27

Wissensaustausch mit Swift:

Ändern des Root-View-Controllers von einer anderen Klasse als app delegate.swift

let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var homeViewController = mainStoryboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
let nav = UINavigationController(rootViewController: homeViewController)
appdelegate.window!.rootViewController = nav

Hoffe das wird jemandem helfen.

Bearbeitet:

Das Ändern des Rootviewcontrollers mit Animation kann erreicht werden mit:

 UIView.transitionWithView(self.window!, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromLeft, animations: {
    self.window?.rootViewController = anyViewController
}, completion: nil)

Wir können eine ähnliche Verallgemeinerungsmethode schreiben .


hi @Arvind, kannst du mir sagen, wo ich diesen Code am besten platzieren kann? Sollte es sich oben in AppDelegate.swift befinden, damit die Variablen global verfügbar sind? Oder muss es irgendwo in einer Klasse sein, da es Ansichten instanziiert? danke
FireDragon

Ja, Sie können bei func application verwenden (Anwendung: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool. Anders als Sie es auf jedem View Controller können. wie Sie möglicherweise benötigen, wenn Sie um Abmeldung bitten.
Arvind

@Arvind, wie man mit Animation umgeht? Es wird keine Animation angezeigt und die rootView wird sofort angezeigt.
Engnyl

@Engnyl: Ich habe die Antwort aktualisiert. Vielen Dank für Ihre Anfrage, die es aktueller macht.
Arvind

Immer null auf self.navigationController
Wasim Ahmed

16

Dieser funktioniert für mich, hoffe es hilft dir,

let rootVC:LoginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as! LoginViewController
let nvc:UINavigationController = self.storyboard?.instantiateViewControllerWithIdentifier("RootNavigationController") as! UINavigationController
nvc.viewControllers = [rootVC]
UIApplication.sharedApplication().keyWindow?.rootViewController = nvc

1
du hast meinen Tag gerettet!
Atom2ueki

Immer null auf self.navigationController
Wasim Ahmed

@WasimAhmed das bedeutet, dass Sie keinen Navigations-Controller als Root-View-Controller haben
Patel Jigar

4

In Swift 3.0 xcode8.1

in allgemeinen Einstellungen in Hauptschnittstelle löschen: Haupt <-dies nach Hauptschnittstelle:

class AppDelegate...

 var window: UIWindow?

    fun application...

      window = UIWindow(frame: UIScreen.main.bounds)
      window?.makeKeyAndVisible()
      window?.rootViewController = UINavigationController(rootViewController: NewYourController)

-1
  let storyboard = UIStoryboard(name: "Main", bundle: nil)         
  let yourNewRootView = storyboard.instantiateViewControllerWithIdentifier("yourNewRootView") as? yourNewRootView


   self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    UIView.transitionWithView(self.window!, duration: 0.1, options: [UIViewAnimationOptions.TransitionFlipFromRight,UIViewAnimationOptions.TransitionFlipFromLeft], animations: 
    {
        // animation

        }, completion: { (finished: Bool) -> () in

            self.window?.rootViewController = nil
            self.window?.rootViewController = yourNewRootView
            self.window?.makeKeyAndVisible()
    })
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.