Macos 通过单击Swift中的按钮显示/隐藏窗口

Macos 通过单击Swift中的按钮显示/隐藏窗口,macos,swift,cocoa,nswindowcontroller,Macos,Swift,Cocoa,Nswindowcontroller,我想通过单击主窗口中的按钮在swift中显示/隐藏窗口。Beginsheet正在显示窗口,但endsheet没有关闭窗口。我的appdelegate代码如下所示: import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! func applicationDidFinishLaunching

我想通过单击主窗口中的按钮在swift中显示/隐藏窗口。Beginsheet正在显示窗口,但endsheet没有关闭窗口。我的appdelegate代码如下所示:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!


    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // Insert code here to initialize your application
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }

    var settingsController: SettingsController?

    @IBAction func inSettings(sender: NSObject?)
    {
        settingsController = SettingsController(windowNibName: "SettingsController")
        window.beginSheet(settingsController!.window!, completionHandler: nil)
    }
    @IBAction func outSettings(sender: NSObject?)
    {
        window.endSheet(settingsController!.window!)
    }

}
设置控制器:

import Cocoa

class SettingsController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    }
}
使用“结束页”结束文档模式工作表任务。像这样:

@IBAction func outSettings(sender: NSObject?)
{
    settingsController!.window!.endSheet(settingsController!.window!)
}
编辑:您需要实际关闭调用orderOut的完成处理程序中的窗口,如下所示:

@IBAction func inSettings(sender: NSObject?)
{
    settingsController = SettingsController(windowNibName: "SettingsController")
    window.beginSheet(settingsController!.window!) {
        settingsController!.window!.orderOut(nil)
    }
}
Swift 3解决方案:

假设您有WindowA和WindowB。您想打开WindowB,但首先要隐藏WindowA。 使用segue连接windows。选择ShowasSeguesKind属性,您需要一个静态类来保持隐藏窗口。在WindowA中,重写应执行segue并将WindowA保持为静态NSWindow对象

 override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {

        YourStaticClass.WindowA = self.view.window
        self.view.window?.orderOut(self)

        return true
    }
orderOutself隐藏窗口。然后WindowB将被打开

在WindowB的视图控制器中,使用功能关闭WindowB并显示隐藏的WindowA:

 @IBAction func btnBack_Click(_ sender: NSButton) {  

    YourStaticClass.WindowA?.makeKeyAndOrderFront(YourStaticClass.WindowA)    
    self.view.window?.close()
}

@Devan不工作也没用。有错误吗?如果有,是哪一个?难道它什么都不做吗?请提供详细信息。@Aderstedt:我将您的代码复制到项目中,它显示:AppDelegate.swift:30:16:无法使用“NSWindow,->”类型的参数列表调用“beginSheet”:没有错误,但它什么也不做。endsheet应该关闭窗口,但它没有。除了beginsheet,还有其他方法从另一个窗口打开窗口吗?是的,有很多,看看它包含了所有东西。