2013-04-25 11 views
55

Wie stelle ich die rootViewController von UINavigationController durch eine andere Methode als 10?Set rootViewController von UINavigationController durch andere Methode als initWithRootViewController

Ich möchte initWithNavigationBarClass:toolbarClass: verwenden, um eine benutzerdefinierte Symbolleiste für meine NavigationController zu liefern, so glaube ich nicht, dass ich verwenden kann.

+0

Ein Ansatz, den ich gerade entdeckt habe, ist: [Navigation setViewControllers: [ NSArray arrayWithObject: (Zeiger auf View-Controller, der der Root-View-Controller sein soll)]]; Ist das der beste Weg? Ich nehme an, dass Sie dies nur in der AppDelegate-Datei bei der DidFinishLaunching-Delegiertenmethode aufrufen sollten, da es nach dem – drc

Antwort

110

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

So:

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

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

riskanten Durcheinander mit dem View-Controller-Array von UINavigationController scheint. Vielen Dank für die Bestätigung. Dies muss möglicherweise in einer separaten Frage gehen, aber ich nehme an, die initWithNav .. bedeutet, dass alle meine Symbolleisten das gleiche Aussehen haben, die ich in der benutzerdefinierten Unterklasse festgelegt habe. Wie habe ich dann verschiedene gestylte Symbolleisten für verschiedene Bereiche meiner App? Übertrage ich verschiedene Symbolleisten von dieser benutzerdefinierten Unterklasse? Oder gibt es einen besseren Ansatz? – drc

+0

Dafür können Sie 'navigationController.navigationBar.tintColor = [UIColor blackColor];' oder wie Sie es in der '- (void) viewDidAppear: animated:' Methoden Ihrer ViewControllers –

+0

style So würde dies die Tatsache überschreiben, dass In meiner UIToolBar-Unterklasse überschreibe ich drawRect und setze einen benutzerdefinierten Hintergrund? So stelle ich dies um: UIImage * backgroundImage = [UIImage imageNamed: @ "UIToolBar_Background.png"]; [backgroundImage drawInRect: CGRectMake (0, 0, self.frame.size.width, self.frame.size.height)]; – drc

16

Wissen teilen Mit Swift:

Ändern root-View-Controller von 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 

hoffen, dass dies hilfreich für jemanden .

Edited:

ändern RootViewController mit Animation erreichen werden kann mit:

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

Wir Verfahren verallgemeinern schreiben zu ähnlich this.

+0

hi @Arvind, können Sie mir sagen, der beste Ort, um diesen Code zu setzen? Sollte es an der Spitze von AppDelegate.swift sein, damit die Variablen global verfügbar sind? Oder muss es irgendwo in einer Klasse sein, da es Ansichten instanziiert? danke – FireDragon

+0

Ja, können Sie bei Func-Anwendung (Anwendung: UIApplication, didFinishLaunchingWithOptions LaunchOptions: [NSObjekt: AnyObject]?) -> Bool. Anders als Sie auf jedem Blick Controller können. wie Sie benötigen, wenn Sie um Abmeldung bitten. – Arvind

+0

@Arvind wie man mit Animation umgehen? Keine Animation wird angezeigt und die rootView wird sofort angezeigt. – Engnyl

0
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() 
    }) 
7

dies für mich funktioniert, hoffe, es hilft Ihnen,

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

Sie haben meinen Tag gerettet! – atom2ueki

+1

Der einzige, der funktioniert! – Marin

+0

danke @ atom2ueki –

1

In swift 3.0 xcode8.1

im allgemeinen Einstellungen in Main-Schnittstelle löschen: Haupt < -Diese nach Haupt Schnittstelle:

class AppDelegate... 

var window: UIWindow? 

    fun application... 

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