2015-05-04 14 views
12

Wykonuję instrukcje (wbudowany przepływ) w mojej aplikacji i chciałbym mieć przycisk pomijania. Przycisk znajduje się na viewController, więc doszedłem do wniosku, że najlepszym sposobem na przejście do innego viewController byłoby okno delegata aplikacji dostępu.Swift - Uzyskiwanie dostępu do okna AppDelegate od viewController

Jednak wciąż pojawia mi się błąd, że AppDelegate.Type nie ma członka o nazwie "okno".

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

Czy jest coś nie tak z takim podejściem?

Z góry dziękuję!

Odpowiedz

29

Masz literówkę ma być appDelegate nie AppDelegate. Więc tak:

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

Ok w porządku, co za błąd studip! Btw, teraz jest problem z RootViewController, jak uzyskać dostęp do kontrolera widoku, który jest zadeklarowany w storyboardie? Zgaduję, że zrobienie nowej instancji nie jest dobrym pomysłem? Chodzi mi o to, że RootViewController() prowadzi do czarnego ekranu, więc powinno być inne oczekiwanie na dostęp do takiego kontrolera. – DCDC

+0

Oto jak to zrobić w moim kodzie 'let storyboardId =" LoginStoryboardIdentifier "' 'self.window? .rootViewController = self.window? .rootViewController? .storyboard? .instantiateViewControllerWithIdentifier (storyboardId) as? UIViewController' –

+0

Działa doskonale, ale zauważając zużycie pamięci, nie zauważam zmniejszenia pamięci po zamianie kontrolera Root View (a) na (b). Oznacza to, że (a) nie został wymazany z pamięci, prawda? Jak wymazać to z pamięci 1. a następnie pokazać (b) kontroler –

1

Używasz nazwy protokołu (tj AppDelegate) zamiast instancję:

Powinno być:

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

Używam twojego kodu do wypychania, ale co do kontrolera cofania .. –

5

Swift 3

Jest lepszy sposób:

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

Ta praca rozwiązanie dla: Po sesji/Zapis Programowo dodać UITabBarController

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

Chociaż ten fragment kodu jest mile widziany i może zapewnić pomoc, to [ znacznie poprawione, jeśli zawiera wyjaśnienie] (// meta.stackexchange.com/q/114762) * how * i * why * to rozwiązuje problem. Pamiętaj, że odpowiadasz na pytanie dla czytelników w przyszłości, a nie tylko pytasz teraz! Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie i podać, jakie ograniczenia i założenia mają zastosowanie. –

Powiązane problemy