2013-04-25 10 views
55

Come impostare rootViewController di UINavigationController con un metodo diverso da initWithRootViewController?Impostare rootViewController di UINavigationController con un metodo diverso da initWithRootViewController

Desidero utilizzare initWithNavigationBarClass:toolbarClass: per fornire una barra degli strumenti personalizzata per il mio NavigationController, quindi non credo di poter utilizzare initWithRootViewController.

+0

Un approccio che ho appena scoperto è: [setViewControllers navigationController: [ NSArray arrayWithObject: (Puntatore per visualizzare il controller che dovrebbe essere il controller della vista radice)]]; è questo il modo migliore? Presumo che dovresti chiamarlo solo nel file AppDelegate al metodo delegato di didFinishLaunching, poiché sembra rischioso fare casino con l'array del controller di visualizzazione di UINavigationController dopo questo – drc

risposta

110

È possibile risolvere questo chiamando setViewControllers.

Ti piace questa:

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

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

Grazie per la conferma. Potrebbe essere necessario inserire una domanda separata, ma suppongo che initWithNav .. significhi che tutte le mie barre degli strumenti avranno lo stesso aspetto che ho impostato nella sottoclasse personalizzata. In che modo ho quindi diverse barre degli strumenti in stile per diverse sezioni della mia app? Devo restituire barre degli strumenti diverse da quella sottoclasse personalizzata? O c'è un approccio migliore? – drc

+0

Per questo è possibile utilizzare 'navigationController.navigationBar.tintColor = [UIColor blackColor];' o comunque lo si vuole modellare nei metodi '- (void) viewDidAppear: animated:' dei ViewControllers –

+0

Quindi questo dovrebbe prevalere sul fatto che nella sottoclasse UIToolBar sto sovrascrivendo drawRect e impostando uno sfondo personalizzato? Ecco come implemento questo: UIImage * backgroundImage = [UIImage imageNamed: @ "UIToolBar_Background.png"]; [backgroundImage drawInRect: CGRectMake (0, 0, self.frame.size.width, self.frame.size.height)]; – drc

16

condivisione delle conoscenze Utilizzando Swift:

Modifica View Controller radice dalla classe diversa applicazione 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 

auguriamo che questo utile per qualcuno .

Modificato:

Modifica RootViewController Con animazione può essere raggiungere con:

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

Possiamo scrivere il metodo troppo simile a this.

+0

ciao @Arvind, puoi dirmi il posto migliore per inserire questo codice? Dovrebbe essere nella parte superiore di AppDelegate.swift in modo che le variabili siano disponibili globalmente? O forse ha bisogno di essere all'interno di una classe da qualche parte dal momento che sta istanziando viste? grazie – FireDragon

+0

Sì, è possibile utilizzare l'applicazione func (applicazione: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool. Altro che puoi su qualsiasi controller di visualizzazione. come è necessario quando chiedi il logout. – Arvind

+0

@Arvind come gestire l'animazione? Nessuna animazione è mostrata e il rootView è mostrato istantaneamente. – 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

questo funziona per me generalizzare, spero che ti aiuta,

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

hai salvato la mia giornata! – atom2ueki

+1

L'unico che funziona! – Marin

+0

grazie @ atom2ueki –

1

a Swift 3.0 xcode8.1

nelle impostazioni generali eliminare nel Main Interfaccia: Principale < -questo dopo principale Interfaccia:

class AppDelegate... 

var window: UIWindow? 

    fun application... 

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