2015-08-11 39 views
9

Kullanıcı henüz giriş yapmadıysa, ilk önce bir oturum açma/kayıt penceresi gösterdiğim bir OSX uygulaması geliştiriyorum.Koşullu olarak uygulama başladığında NSViewController gösteriliyor

Giriş yaptıktan sonra ana görünüm denetleyicimi gösteriyorum.

Kullanıcı önceden giriş yapmışsa (bir simge kaydedilmişse), uygulama doğrudan ana görünüm denetleyicisiyle başlatılmalıdır.

OSX geliştirme konusunda yeniyim, bu tür senaryoları inceledim ancak hiçbir şey bulamadım.

Çalıştığımı düşündüğüm şeyle gittim. Bazen çalışır, bazen boş bir pencere alırım.

Hikaye panosunda Ana Menü ve Pencere Denetleyicisine izin verdim. "Içerir" segue ana görünüm denetleyicisine kaldırıldı. pencere boş zamanlarında yaklaşık yarısı

func applicationDidFinishLaunching(aNotification: NSNotification) { 

    if loggedIn { 
     self.showViewController(NSStoryboard.mainViewController()) 

    } else { 
     let loginController = NSStoryboard.loginViewController() 
     loginController.delegate = self 
     self.showViewController(loginController) 
    } 
} 

private func showViewController(viewController: NSViewController) { 
    if let mainWindow = NSApplication.sharedApplication().mainWindow { 
     mainWindow.contentViewController = viewController 

    } else { 
     print("Error: No main window!") 
    } 
} 

ve konsol gördüğünüz:

AppDelegate, ben bu koymak "Hata: Hiçbir ana pencere". Belki de applicationDidBecomeActive'u kullanabileceğimi düşündüm ama bu ön plana geldiğinde temel olarak adlandırılır ve ihtiyacım olan şey bu değil.

func onLoginSuccess() { 
    self.showViewController(NSStoryboard.mainViewController()) 
} 

Ve burada da olsun: Çalışır zaman

Ayrıca, saat ve ben, sonra ben ana görünümü denetleyicisi göstermek istiyorum giriş "Hata: Hiçbir ana penceresini!" (her zaman) ve hiçbir şey olmuyor.

docs yaklaşık mainWindow olmanın nil şu demek:

The value in this property is nil when the app’s storyboard or nib file has not yet finished loading. It might also be nil when the app is inactive or hidden.

Ama bunu başlatıyoruz olduğumda neden film şeridi yükleme veya inaktif app bitmedi? Ve giriş başarısı üzerinde uygulama kesinlikle aktif ve ön planda ve ana pencere her zaman sıfırdır.

Neyi yanlış yapıyorum? Bu iş akışını nasıl uygularım? Alternatif olarak, bir "ana" görünüm denetleyicisi oluşturabilirim, öyleyse, hikaye panosundaki pencereye bağlanır ve giriş veya ana görünüm denetleyicisini iç içe geçmiş görünüm denetleyicileri olarak ekleyebilirim. Ancak, hiçbir şey yapma denetleyicisi eklememeyi gerçekten istemiyorum.

kullanıyorum XCode 7 (beta 4), Swift 2, OSX 10.10.4 Düzenleme

:

extension NSStoryboard { 

    private class func mainStoryboard() -> NSStoryboard { return NSStoryboard(name: "Main", bundle: NSBundle.mainBundle()) } 
    private class func signupStoryboard() -> NSStoryboard { return NSStoryboard(name: "LoginRegister", bundle: NSBundle.mainBundle()) } 

    class func mainViewController() -> ViewController { 
     return self.mainStoryboard().instantiateControllerWithIdentifier("MainViewController") as! ViewController 
    } 

    class func loginViewController() -> LoginViewController { 
     return self.signupStoryboard().instantiateControllerWithIdentifier("LoginViewController") as! LoginViewController 
    } 

    class func registerViewController() -> RegisterViewController { 
     return self.signupStoryboard().instantiateControllerWithIdentifier("RegisterViewController") as! RegisterViewController 
    } 
} 
:

NSStoryboard yöntemleri bir uzantısı gelen

, bu gibi görünüyor

+0

'NSStoryBoard.mainViewController()' - Bu sınıf yöntemi nereden geliyor? Genel olarak OSX, NSApplicationMain'de bir ana nib (storyboard?) 'U info.plist'den başlatmaya çalışan bir sihire sahiptir. Ve ben bunu storyboard'larla izlemeye çalışıyorum ama mainViewController ve loginViewController sınıf yöntemlerinin nereden geldiğine takıldım ... – stevesliva

+2

Eğer ayrı bir NSWindowController nesnesi kullanıyorsanız, bu pencereyi neden doğrudan bu pencereye göndermiyorsunuz? –

+0

@stevesliva bir uzantı içinde, – Ixx

cevap

2

Yorumlar içinde bulduğumuz çözümü bir yanıt olarak belirtmek için:

Görünüşe göre NSApplication.sharedApplication().mainWindow, hikaye panosundaki ana penceremden farklı bir penceredir.

NSWindowController alt sınıf oluşturdum ve bunu, kimlik denetçisini kullanarak film şeridindeki pencereye atadım.

Daha sonra uygulama temsilcisi olarak sahip olduğum mantığı bu NSWindowController öğesine taşıdım.Şöyle görünüyor:

class MainWindowController: NSWindowController, LoginDelegate { 

    override func windowDidLoad() { 

     if loggedIn { 
      self.onLoggedIn() 
     } else { 
      let loginController = NSStoryboard.loginViewController() 
      loginController.delegate = self 
      self.contentViewController = loginController 
     } 
    } 

    func onLoggedIn() { 
     self.contentViewController = NSStoryboard.mainViewController() 
    } 

    func onLoginSuccess() { 
     self.onLoggedIn() 
    } 
} 

* Teşekkürler Lucas Derraugh beni doğru yönde işaret ettiğin için!

İlgili konular