我正在开发一个OSX应用程序,如果用户还没有登录,我首先会显示一个登录/注册窗口。
登录成功后,我将显示我的主视图控制器。
如果用户已经登录(存储了令牌),则应用程序必须直接与主视图控制器一起启动。
我是OSX开发的新手,我在谷歌上搜索了这类场景,但什么也找不到。
所以我提出了我认为应该起作用的东西。有时候会起作用,有时我会得到一个空白的窗口。
在故事板中,我让主菜单和窗口控制器。我删除了我的主视图控制器的“包含”符号。
在AppDelegate中,我说:
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!")
}
}大约有一半的时间窗口是空的,我在控制台中看到“错误:没有主窗口!”。我想也许我可以使用applicationDidBecomeActive,但这基本上是所谓的前景,这不是我所需要的。
此外,它工作的时间,我登录,然后我想显示主视图控制器:
func onLoginSuccess() {
self.showViewController(NSStoryboard.mainViewController())
}这里我还得到了“错误:没有主窗口!”(总是)什么都没发生。
医生们说,mainWindow是零的。
当应用程序的情节提要或nib文件尚未完成加载时,此属性中的值为零。当应用程序处于非活动状态或隐藏状态时,也可能为零。
但是为什么故事板没有完成加载,或者当我启动它的时候应用程序是不活动的?登录成功后,应用程序肯定是活动的,在前台和主窗口总是为零。
我做错了什么?如何实现此工作流?或者,我可以创建一个“父”视图控制器,将其连接到情节提要中的窗口,并将登录或主视图控制器作为嵌套视图控制器添加到其中。但是,不太喜欢添加一个do nothing视图控制器。
我使用的是XCode 7(beta 4),Swift 2,OSX10.10.4
编辑:
NSStoryboard方法来自一个扩展,如下所示:
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
}
}发布于 2015-08-12 11:29:18
为了将我们在评论中找到的解决方案作为一个答案:
显然,NSApplication.sharedApplication().mainWindow是一个不同于我在故事板主窗口的窗口。
因此,我创建了一个NSWindowController子类,并使用身份检查器将其分配给情节提要中的窗口。
然后,我将应用程序委托中的逻辑转移到这个NSWindowController中。看起来是这样的:
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()
}
}*谢谢卢卡斯·德劳为我指明了正确的方向!
https://stackoverflow.com/questions/31950410
复制相似问题