我对Swift和“ Apple”编程非常陌生,所以如果我的问题很愚蠢,请原谅。

我正在尝试对NSPopupButton进行子类化,以添加用于绑定菜单项的image属性的选项。

我想覆盖“绑定”功能:

override func bind(_ binding: NSBindingName, to observable: Any, withKeyPath keyPath: String, options: [NSBindingOption : Any]? = nil)


并观察“ observable”参数,所以这是我到目前为止编写的代码:

class WDPopupButton: NSPopUpButton
{
    static let ImageBindingContext: UnsafeMutableRawPointer? = UnsafeMutableRawPointer(mutating: "imageContext")

    override func bind(_ binding: NSBindingName, to observable: Any, withKeyPath keyPath: String, options: [NSBindingOption : Any]? = nil)
    {
        if(binding == NSBindingName.image)
        {
            guard let observableObject = observable as AnyObject? else
            {
                return
            }

            observable.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)

            ...
        }
    }
}


但我收到以下错误:

Value of type 'Any' has no member 'addObserver'


我的问题是,要在observable参数上调用addObserver,我需要做什么?

如您所见,我确实尝试将observable转换为AnyObject类型,但随后收到另一个错误,找不到解决方案。

我将addObserver行更改为:

observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)


并得到:

Type of expression is ambiguous without more context


如果将可观察的对象转换为AnyObject是解决方案,那么此错误是什么意思,我在做什么错?

谢谢

最佳答案

编译器告诉您Any实例没有名为addObserver的方法,这就是observable.addObserver不起作用的原因。 (类型“ Any”的值没有成员“ addObserver”)

对于observableObject.addObserver,它也与上面类似,AnyObject没有addObserver方法。

解:

不要强制转换为AnyObject,请勿强制转换为NSObject。可通过addObserver实例访问NSObject。然后通过强制转换的addObserver实例访问NSObject

guard let observableObject = observable as? NSObject else {return}

observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)

09-16 03:08