我试图在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/