xcode 如何在Swift 4中为macOS应用程序编程显示窗口/视图控制器

xxls0lw8  于 2023-03-24  发布在  Swift
关注(0)|答案(2)|浏览(154)

我尝试在我的macOS应用程序中以编程方式显示一个窗口。我想以编程方式完成的原因是因为用户单击一个Login按钮,结果函数取决于登录成功。如果成功,则显示该窗口;否则就不是。
下面是我的Xcode窗口的截图:

下面是我在代码中所做的尝试(Alert是我创建的一个类,用于简化NSAlert对话框的显示):

@IBAction func btnLogin_Click(_ sender: Any) {
    let email = txtEmail.stringValue
    if(email.isEmpty) {
        Alert.show(parent: view.window!, message: "Email is required.")
        return
    }

    let password = txtPassword.stringValue
    if(password.isEmpty) {
        Alert.show(parent: view.window!, message: "Password is required.")
        return
    }

    // this does not work, even though I gave the window and view controllers
    // both identifiers in the storyboard
    self.storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("wcStores"))
}

苹果的NSStoryboard.SceneIdentifier文档几乎不存在,我看到的其他方法似乎与早期版本的Swift有关。
我哪里做错了?

2mbi3lxu

2mbi3lxu1#

好吧,这不是我最初想做的,但这种方式要好得多,也是我真正想要的。

let vcStores = self.storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("vcStores"))
        as! NSViewController
self.view.window?.contentViewController = vcStores

这只会将窗口的内容替换为Interface Builder中定义的视图vcStores中的内容。
This video也有帮助,尽管是在iOS和Swift 3上。我一开始试图创建一个新的NSWindow,因为我已经习惯了在Java Swing或C# Windows Forms中进行桌面开发。但我喜欢像这样简单地切换窗口内容。

xiozqbni

xiozqbni2#

使用这两个函数转到目标NSViewcontroller/UIViewcontroller:(必须为目标视图控制器分配一个唯一的情节提要ID)

Mac应用程序:

public func gotToNextVc(_ viewControllerIdentifier: String) {
        let nextVC = self.storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(viewControllerIdentifier))
                    as! NSViewController
                self.view.window?.contentViewController = nextVC
        }

iOS APP:

public func gotToNextVc(_ viewControllerIdentifier: String){
    let storyBoard = UIStoryboard(name: ViewControllers.STORYBOARD, bundle: nil)
    let nextViewController = storyBoard.instantiateViewController(withIdentifier: viewControllerIdentifier)
    view.endEditing(true)
    nextViewController.modalPresentationStyle = .fullScreen
    nextViewController.modalTransitionStyle = .coverVertical
    self.present(nextViewController, animated: false, completion: nil)
    }

相关问题