首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在app启动时有条件地显示NSViewController

在app启动时有条件地显示NSViewController
EN

Stack Overflow用户
提问于 2015-08-11 19:33:40
回答 1查看 1.8K关注 0票数 10

我正在开发一个OSX应用程序,如果用户还没有登录,我首先会显示一个登录/注册窗口。

登录成功后,我将显示我的主视图控制器。

如果用户已经登录(存储了令牌),则应用程序必须直接与主视图控制器一起启动。

我是OSX开发的新手,我在谷歌上搜索了这类场景,但什么也找不到。

所以我提出了我认为应该起作用的东西。有时候会起作用,有时我会得到一个空白的窗口。

在故事板中,我让主菜单和窗口控制器。我删除了我的主视图控制器的“包含”符号。

在AppDelegate中,我说:

代码语言:javascript
复制
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,但这基本上是所谓的前景,这不是我所需要的。

此外,它工作的时间,我登录,然后我想显示主视图控制器:

代码语言:javascript
复制
func onLoginSuccess() {
    self.showViewController(NSStoryboard.mainViewController())
}

这里我还得到了“错误:没有主窗口!”(总是)什么都没发生。

医生们说,mainWindow是零的。

当应用程序的情节提要或nib文件尚未完成加载时,此属性中的值为零。当应用程序处于非活动状态或隐藏状态时,也可能为零。

但是为什么故事板没有完成加载,或者当我启动它的时候应用程序是不活动的?登录成功后,应用程序肯定是活动的,在前台和主窗口总是为零。

我做错了什么?如何实现此工作流?或者,我可以创建一个“父”视图控制器,将其连接到情节提要中的窗口,并将登录或主视图控制器作为嵌套视图控制器添加到其中。但是,不太喜欢添加一个do nothing视图控制器。

我使用的是XCode 7(beta 4),Swift 2,OSX10.10.4

编辑:

NSStoryboard方法来自一个扩展,如下所示:

代码语言:javascript
复制
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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-12 11:29:18

为了将我们在评论中找到的解决方案作为一个答案:

显然,NSApplication.sharedApplication().mainWindow是一个不同于我在故事板主窗口的窗口。

因此,我创建了一个NSWindowController子类,并使用身份检查器将其分配给情节提要中的窗口。

然后,我将应用程序委托中的逻辑转移到这个NSWindowController中。看起来是这样的:

代码语言:javascript
复制
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()
    }
}

*谢谢卢卡斯·德劳为我指明了正确的方向!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31950410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档