2015-05-04 15 views
12

Faccio il walkthrough (flusso di bordo) nella mia app e mi piacerebbe avere un pulsante di salto. Il pulsante si trova su viewController, quindi ho capito che il modo migliore per spostarsi su un'altra viewController sarebbe accedere alla finestra di delegazione dell'app.Swift - Accesso alla finestra AppDelegate da viewController

Tuttavia, continua a farmi un errore che AppDelegate.Type non ha un membro chiamato "finestra".

@IBAction func skipWalkthrough(sender: AnyObject) { 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    AppDelegate.window!.rootViewController = RootViewController 
} 

C'è qualcosa di sbagliato in tale approccio?

Grazie in anticipo!

risposta

29

Si ha un errore di battitura dovrebbe essere appDelegate non AppDelegate. Quindi, in questo modo:

@IBAction func skipWalkthrough(sender: AnyObject) { 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    appDelegate.window!.rootViewController = RootViewController 
} 
+0

Ok destra, che errore studip! A proposito, ora c'è un problema con RootViewController, come accedere a questo controller di visualizzazione che è dichiarato nello storyboard? Immagino che fare una nuova istanza non sia una buona idea? Voglio dire RootViewController() porta a schermo nero, quindi dovrebbe essere un'altra attesa per accedere a tale controller – DCDC

+0

Ecco come faccio nel mio codice 'lascia storyboardId =" LoginStoryboardIdentifier "' 'self.window? .rootViewController = self.window? .rootViewController? .storyboard? .instantiateViewControllerWithIdentifier (storyboardId) as? UIViewController' –

+0

Funziona perfettamente ma, mentre osservo il consumo di memoria, non vedo alcuna diminuzione della memoria quando sostituisco il controller Root View (a) con (b). Significa che (a) non è stato cancellato dalla memoria, giusto? Come cancellare dalla memoria 1 ° e poi mostrare (b) controller –

1

Si utilizza il nome del protocollo (cioè AppDelegate) invece dell'istanza:

dovrebbe essere:

appDelegate.window!.rootViewController = RootViewController 
14

Swift 3+

let appDelegate = UIApplication.shared.delegate as? AppDelegate 
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let homeController = mainStoryboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController 
    appDelegate?.window?.rootViewController = homeController 
+0

io uso il tuo codice per push ma cosa per tornare controller vista .. –

5

Swift 3

Questo è un modo migliore:

if let window = NSApplication.shared().windows.first { 
     window.acceptsMouseMovedEvents = true; 
    } 
0

Quest'opera soluzione per: Dopo Login/Registrazione di programmazione aggiungere UITabBarController

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    appDelegate.window!.rootViewController = tabs //() 
    appDelegate.window!.makeKeyAndVisible() 
+0

Mentre questo snippet di codice è il benvenuto, e potrebbe fornire un aiuto, sarebbe [ notevolmente migliorato se includesse una spiegazione] (// meta.stackexchange.com/q/114762) di * come * e * perché * questo risolve il problema. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo la persona che chiede ora! Si prega di [modificare] la risposta per aggiungere una spiegazione e fornire un'indicazione di quali limitazioni e ipotesi si applicano. –

Problemi correlati