【问题标题】:Overriding bind method (Swift) - Err: Value of type 'Any' has no member 'addObserver'覆盖绑定方法 (Swift) - 错误:“Any”类型的值没有成员“addObserver”
【发布时间】:2019-05-28 07:47:49
【问题描述】:

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

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

我想重写“绑定”功能:

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

如果将 observable 转换为 AnyObject 是解决方案,那么这个错误意味着什么,我做错了什么?

谢谢

【问题讨论】:

    标签: swift cocoa binding kvc


    【解决方案1】:

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

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

    解决方案:

    不要投射到AnyObject,投射到NSObjectaddObserver 可通过 NSObject 实例访问。然后通过强制转换的NSObject 实例访问addObserver

    guard let observableObject = observable as? NSObject else {return}
    
    observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)
    
    

    【讨论】:

    • 感谢您的回答。也许我应该早点说。我尝试做的第一件事是将 observable 转换为 NSObject,但随后我收到另一个错误:Cannot convert value of type 'Any' to type 'NSObject?'强制
    • 更新了答案。你的问题是 ? 应该在 as 之后而不是 NSObject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多