Swift模态表:willPositionSheet不会被调用

时间:2017-09-09 19:42:00

标签: swift cocoa delegates window modalviewcontroller

我正在尝试在ViewController中设置模态表的位置。 到目前为止我得到的是:

import Cocoa

class ViewController: NSViewController, NSWindowDelegate {

    func window(_ window: NSWindow, willPositionSheet sheet: NSWindow, using rect: NSRect) -> NSRect {
        print("function entered")
    }

    var sheetWindowController: SheetWindowController!

    @IBAction func showSheet(_ sender:AnyObject){
        let windowController = SheetWindowController(windowNibName: "SheetWindowController")
        self.sheetWindowController = windowController
        self.sheetWindowController.delegate = self
        self.view.window?.beginSheet(self.sheetWindowController.window!, completionHandler: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.window?.delegate = self
    }
}

当工作表显示在窗口顶部时,它正在工作。但willPositionSheet方法不会被调用。知道缺少什么吗?

1 个答案:

答案 0 :(得分:1)

2件事。

首先:您的视图控制器view的{​​{1}}属性在window之前可能不会是非空的(您可以通过调试断点来验证窗口是否为非零)。因此,请确保委托实际上是在窗口上设置的。我还要注意,您可能希望尝试将窗口委托与窗口的控制器对象绑定,或者使用不属于视图控制器的不同窗口委托对象。视图控制器是一个奇怪的地方放置这个逻辑。

第二:呈现由viewDidAppear()拥有的窗口似乎由于某种原因没有得到这些回调(我测试时只是传递了一个标准的NSWindowController对象,并且委托收到了{{ 1}}来电)。不知道为什么会出现这种情况,但我猜测这些窗口是如何设置的。话虽如此,您可以尝试使用较新的(10.10)NSWindow演示API,让您的生活更轻松。我会尝试使用willPositionSheet的{​​{1}}来展示NSViewController

总而言之,你可以有类似的东西:

NSViewController

并提出:

NSViewController

希望这有点帮助。