我试图在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方法没有被调用。知道少了什么吗?

最佳答案

两件事。
第一:视图控制器的view属性在window之前可能不会为非nil(您可以通过使用断点调试来验证窗口是否为非nil)。因此,请确保代理实际上设置在窗口上。我还注意到,您可能希望尝试将窗口委托绑定到窗口的控制器对象,或不属于视图控制器的独立窗口委托对象。视图控制器是放置这种逻辑的一个奇怪的地方。
第二:呈现一个viewDidAppear()拥有的窗口似乎并没有因为某种原因得到这些回调(我测试的只是传递一个标准的NSWindowController对象,而代理收到了NSWindow调用)。不知道为什么会这样,但我想是关于这些窗口是如何设置的。也就是说,您可以尝试使用较新的(10.10)willPositionSheet表示api来简化您的生活。我会尝试使用NSViewController'sNSViewController呈现一个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)

希望这能有点帮助。

关于swift - Swift模式表:不会调用willPositionSheet,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46134480/

10-10 21:53