Swift 模态 sheet: willPositionSheet 没有被调用

Swift modal sheet: willPositionSheet does doesn't get called

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

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
    }
}

只要 sheet 出现在 window 的顶部,它就可以正常工作。但是 willPositionSheet 方法没有被调用。知道缺少什么吗?

2 件事。

首先:您的视图控制器 viewwindow 属性 可能在 viewDidAppear() 之前不会为零(您可以通过断点调试来验证 window 是非零)。因此,请确保委托实际设置在 window 上。我还注意到您可能想尝试将 window 委托绑定到 window 的控制器对象或不属于视图控制器的不同 window 委托对象。视图控制器是放置此逻辑的一个奇怪的地方。

其次:呈现一个 NSWindowController 拥有的 window 由于某种原因似乎没有得到这些回调(我测试只是传递一个标准的 NSWindow 对象和代表收到了 willPositionSheet 电话)。不知道为什么会这样,但我猜这些 windows 是如何设置的。话虽如此,您可以尝试使用较新的 (10.10) NSViewController 表示 API 让您的生活更轻松。我会尝试使用 NSViewControllerpresentViewControllerAsSheet(_:).

呈现 NSViewController

所以总而言之你可以有这样的东西:

override func viewDidAppear() {
    super.viewDidAppear()
    self.view.window?.delegate = self
}

并用于展示:

let vc = SheetViewController() // Note this is a view controller, not window controller
presentViewControllerAsSheet(vc)

希望对您有所帮助。