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 件事。
首先:您的视图控制器 view
的 window
属性 可能在 viewDidAppear()
之前不会为零(您可以通过断点调试来验证 window 是非零)。因此,请确保委托实际设置在 window 上。我还注意到您可能想尝试将 window 委托绑定到 window 的控制器对象或不属于视图控制器的不同 window 委托对象。视图控制器是放置此逻辑的一个奇怪的地方。
其次:呈现一个 NSWindowController
拥有的 window 由于某种原因似乎没有得到这些回调(我测试只是传递一个标准的 NSWindow
对象和代表收到了 willPositionSheet
电话)。不知道为什么会这样,但我猜这些 windows 是如何设置的。话虽如此,您可以尝试使用较新的 (10.10) NSViewController
表示 API 让您的生活更轻松。我会尝试使用 NSViewController
的 presentViewControllerAsSheet(_:)
.
呈现 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)
希望对您有所帮助。
我正在尝试在 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 件事。
首先:您的视图控制器 view
的 window
属性 可能在 viewDidAppear()
之前不会为零(您可以通过断点调试来验证 window 是非零)。因此,请确保委托实际设置在 window 上。我还注意到您可能想尝试将 window 委托绑定到 window 的控制器对象或不属于视图控制器的不同 window 委托对象。视图控制器是放置此逻辑的一个奇怪的地方。
其次:呈现一个 NSWindowController
拥有的 window 由于某种原因似乎没有得到这些回调(我测试只是传递一个标准的 NSWindow
对象和代表收到了 willPositionSheet
电话)。不知道为什么会这样,但我猜这些 windows 是如何设置的。话虽如此,您可以尝试使用较新的 (10.10) NSViewController
表示 API 让您的生活更轻松。我会尝试使用 NSViewController
的 presentViewControllerAsSheet(_:)
.
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)
希望对您有所帮助。