【问题标题】:Track NSWindow focus? (Swift, macOS)跟踪 NSWindow 焦点? (斯威夫特,macOS)
【发布时间】:2021-10-01 01:11:34
【问题描述】:

我正在尝试跟踪创建的窗口焦点,以便对这些事件执行操作。

我可以使用NSView.frameDidChangeNotification 在通知中心跟踪窗口框架尺寸,但我找不到使用NSWindowDidResignKeyNotificationNSWindowDidResignMainNotification 之类的正确方法。

private func newWindow() {
    let windowInfo  = WindowInfo()
    let contentView = ContentView()
        .environmentObject(windowInfo)

    let window = NSWindow(
        contentRect: NSRect(x: 0, y: 0, width: 350, height: 600),
        styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
        backing: .buffered,
        defer: false
    )

    window.isReleasedWhenClosed                         = false
    window.contentView                                  = NSHostingView(rootView: contentView)
    window.contentView?.postsFrameChangedNotifications  = true
    window.makeKeyAndOrderFront(nil)

    // vvv  I'm trying to use a similar method of being notified when a created window loses/regains focus.  vvv
    //                                                          v v v
    NotificationCenter.default.addObserver(forName: NSView.frameDidChangeNotification, object: nil, queue: nil) { (notification) in
        windowInfo.frame = window.frame
    }
}

另外,如果在 SwiftUI 中有一些检测窗口焦点的方法,我也可以使用它。执行操作的通知适用于我在 SwiftUI 中的视图

【问题讨论】:

  • 请贴出你试过的代码。
  • 必须在创建窗口之前使用 NotificationCenter.default.addObserver 才能捕获通知

标签: swift macos nswindow appkit


【解决方案1】:

这只是我的一个愚蠢的疏忽(已经很晚了),我找到了我需要的线路。

添加NSWindow.didBecomeKeyNotification 可以正确捕获焦点事件。

还将object: nil 更改为object: window 确保捕获的焦点事件仅针对特定窗口,而不是全部。

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2017-11-13
    • 2015-08-19
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多