Macos 如何在OSX Mavericks上显示ViewControllerAsheet?

Macos 如何在OSX Mavericks上显示ViewControllerAsheet?,macos,swift,cocoa,osx-mavericks,nsviewcontroller,Macos,Swift,Cocoa,Osx Mavericks,Nsviewcontroller,说来话长,但简而言之;我的第一个OSX应用程序(在约塞米蒂)是用Swift编写的,使用了一个故事板,直到我发现我的(完成的)应用程序不会在Mavericks上运行。我需要在小牛上运行,所以我用笔尖替换了故事板 我的问题是赛格;我使用“图纸类型”分段在主视图控制器上方的图纸中显示其他视图控制器。调用NSViewController的PresentViewControllerAsheet方法是一个很好的替代方法,因为它看起来是一样的,但是这个API是在Yosemite中引入的-所以我需要为Maver

说来话长,但简而言之;我的第一个OSX应用程序(在约塞米蒂)是用Swift编写的,使用了一个故事板,直到我发现我的(完成的)应用程序不会在Mavericks上运行。我需要在小牛上运行,所以我用笔尖替换了故事板

我的问题是赛格;我使用“图纸类型”分段在主视图控制器上方的图纸中显示其他视图控制器。调用NSViewController的PresentViewControllerAsheet方法是一个很好的替代方法,因为它看起来是一样的,但是这个API是在Yosemite中引入的-所以我需要为Mavericks解决如何做到这一点

在主视图上的按钮操作中,我尝试使用beginSheet,如下所示:

secondViewController = SecondViewController(nibName: "SecondViewController", bundle: nil)
self.view.window?.beginSheet(secondViewController!view.window!, completionHandler: nil)
但第二个视图控制器的窗口在运行时为空。我已尝试将新的视图控制器作为子视图添加到应用程序窗口,但这是一个无法识别的选择器:

NSApplication.sharedApplication().windows[0].addSubView(secondViewController!.view)
我到处寻找关于如何显示工作表的描述,我能找到的只是:但很抱歉,我承认我不明白答案。有人能帮我写一些工作代码吗?我开始担心我正在尝试做一些不寻常的事情,但在约塞米蒂看起来还不错,那么在约塞米蒂发布之前人们是如何做到这一点的呢

编辑 我还没有找到解决方案,所以我已经组装了一个小应用程序,它显示了我遇到的问题

在AppDelegate.swift中:

class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet weak var window: NSWindow!
    var mainViewController: FirstView!   
    func applicationDidFinishLaunching(aNotification: NSNotification) {
        mainViewController = FirstView(nibName:"FirstView", bundle: nil)
        window.contentView = mainViewController.view
        mainViewController.view.frame = (window.contentView as! NSView).bounds
    }
}
在FirstView.swift中(关联的NIB有一个“打开工作表”按钮)

在SecondView.swift中(关联的NIB有一个“关闭”按钮)

在SecondWinCon.swift中(相关NIB为空)


如果方法1未注释,您将看到我试图模拟的行为(请记住,它仅适用于OS X 10.10)。方法2或3显示第二个视图,但不显示为图纸

如果你到这里来寻找解决方案,我用方法3就快到了。我错过的重要一步是在NSWindowController的NIB中关闭“启动时可见”(这是NSWindow的一个属性)。在我的示例代码中,这是在SecondWinCon.nib中

我也有同样的问题,发现可能与视图生命周期无关。 当我在viewDidLoad中调用PresentViewControllerasheet时,该工作表将不会显示,您将在控制台中看到:

未能在(NSWindow):presentViewController:animator::View“”的视图不在窗口/视图层次结构中设置(contentViewController)用户定义的已检查属性

如果您在ViewWillDisplay或ViewDidDisplay中触发此选项,则完全没有问题

更新

好吧,让我们说清楚

对于这个最初的情节提要,NSWindowController与一个视图控制器连接,将其视为根视图控制器(RootVC)。 创建所需的另一个视图控制器作为故事板中的图纸(SheetVC)。 在RootVC的ViewWillDisplay或ViewDidDisplay中,[self-PresentViewControllerAsheet:SheetVC]


该表将显示,无需额外代码。

我想投票给@boyFarrell,感谢他的帮助-方法3是他的建议-但我没有足够好的声誉。
class FirstView: NSViewController {
    var secondView: SecondView?
    var secondWindow: SecondWinCon?    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func pressButton(sender: AnyObject) {
        secondView = SecondView(nibName: "SecondView", bundle: nil)!
// method 1 - this is the behaviour I want (but it only works on OSX 10.10)
//        presentViewControllerAsSheet(secondView!)
// method 2 - this just creates a floating window
//        self.view.addSubview(secondView!.view)
//        self.view.window?.beginSheet(secondView!.view.window!, completionHandler: nil)
// method 3 - this also creates a floating window
        secondWindow = SecondWinCon(windowNibName: "SecondWinCon")
        self.view.window?.beginSheet(secondWindow!.window!, completionHandler: nil)   
    }    
}
class SecondView: NSViewController {   
    override func viewDidLoad() {
        super.viewDidLoad()
    }       
    @IBAction func dismissPressed(sender: AnyObject) {
        if (presentingViewController != nil) {
            presentingViewController?.dismissViewController(self)
        } else {
            self.view.window?.sheetParent?.endSheet(self.view.window!)
        }
    }
}
class SecondWinCon: NSWindowController {
    var secondView: SecondView?
    override func windowDidLoad() {
        super.windowDidLoad()   
        secondView = SecondView(nibName: "SecondView", bundle: nil)!
        self.window?.contentView.addSubview(secondView!.view)
    }   
}