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.

drc
quelle
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)
Leon Lucardie
quelle
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 .

Arvind
quelle
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
Patel Jigar
quelle
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)
Anton Russland
quelle
-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()
    })
idris yıldız
quelle