gpt4 book ai didi

Swift 模态表 : willPositionSheet does doesn't get called

转载 作者:行者123 更新时间:2023-11-28 15:20:13 27 4
gpt4 key购买 nike

我正在尝试在 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 方法不会被调用。知道缺少什么吗?

最佳答案

2 件事。

首先:您的 View Controller viewwindow 属性在viewDidAppear() 之前可能不会是nonnil(您可以通过调试验证带有断点的窗口是否为非零)。因此,请确保委托(delegate)实际设置在窗口上。我还注意到,您可能想尝试将窗口委托(delegate)与窗口的 Controller 对象或不属于 View Controller 的不同窗口委托(delegate)对象联系起来。 View Controller 是放置此逻辑的一个奇怪的地方。

其次:呈现一个由 NSWindowController 拥有的窗口由于某种原因似乎没有得到这些回调(我测试只是传递一个标准的 NSWindow 对象和委托(delegate)收到 willPositionSheet 调用)。不知道为什么会这样,但我猜这些窗口的设置方式有些问题。话虽如此,您可以尝试使用更新的 (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)

希望对您有所帮助。

关于Swift 模态表 : willPositionSheet does doesn't get called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com