本文介绍了设置SWIFT对象/属性的观察器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在寻找一种方法,以便在连接到Mac的显示器数量发生变化时触发方法。我知道我可以获取NSScreen.creens.count的值,但我需要找到一种方法,以便在该值发生更改或其他指示连接的显示器数量发生变化时创建通知或其他内容。

我尝试过KVO示例herehere,但为了让这两个示例中的任何一个正常工作,需要有一个触发类内方法的事件。

本质上,这就是我想要基于第一个链接所做的事情:


class EventObserverDemo {
    var statusObserver: NSKeyValueObservation?
    var objectToObserve: NSScreen.screens.count?
    
    func registerAddObserver() -> Void {
        statusObserver = objectToObserve?.observe(NSScreen.screens.count, options: [.new, .old], changeHandler: {[weak self] (NSScreen.screens.count, change) in
            if let value = change.newValue {
                // observed changed value and do the task here on change.
                print("The display count has changed.")
            }
        })
    }
    
    func unregisterObserver() -> Void {
        if let sObserver = statusObserver {
            sObserver.invalidate()
            statusObserver = nil
        }
    }
}

我尝试使用使用NSScreen.ColorSpaceDidChangeNotification的通知,但如果显示器断开连接,则不会触发通知。

我想找到一种方法来检测任何时候连接或断开外部显示器的情况。肯定有一些我还没有发现的东西,因为每当我将外部显示器插入Mac时,我都会看到主显示器上的屏幕发生了变化,所以无论我是插入显示器还是从Mac上拔下,都会有某种通知表明发生了变化。

我查看了didSet函数,但我想不出在NSScreen.creens.count属性上实现该函数的方法。

我还查看了NSScreen.creens.count的属性包装,但同样也搞不清楚这一点。

推荐答案

您可以观察NSApplication.didChangeScreenParametersNotification通知。此示例将在每次连接或断开显示器时仅打印一次,以及屏幕数量的变化。

编码:

class EventObserverDemo {
    var lastCount = NSScreen.screens.count

    init() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(trigger),
            name: NSApplication.didChangeScreenParametersNotification,
            object: nil
        )
    }

    @objc private func trigger(notification: NSNotification) {
        let newCount = NSScreen.screens.count

        if newCount != lastCount {
            print("Switched from (lastCount) to (newCount) displays")
            lastCount = newCount
        }
    }
}

您也不需要删除/使观察者无效,让系统更轻松地处理它:

这篇关于设置SWIFT对象/属性的观察器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 03:09