Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UIButton上重写“isSelected”或“isEnabled”无效_Ios_Swift_Uibutton_Key Value Observing - Fatal编程技术网

Ios 在UIButton上重写“isSelected”或“isEnabled”无效

Ios 在UIButton上重写“isSelected”或“isEnabled”无效,ios,swift,uibutton,key-value-observing,Ios,Swift,Uibutton,Key Value Observing,我试图创建一个自定义UIButton子类,它在正常、选中和禁用状态下具有不同的颜色。我的按钮存在于一个框架中,然后被导入到一个应用程序中,但我在这里放置的每个代码片段,我都在主应用程序和框架中尝试过——我知道这不会有任何区别,但我想涵盖我的基础。我不能让它工作来救我的命 class BrokenButton: UIButton { override var isEnabled: Bool { didSet { print("This is neve

我试图创建一个自定义UIButton子类,它在正常、选中和禁用状态下具有不同的颜色。我的按钮存在于一个框架中,然后被导入到一个应用程序中,但我在这里放置的每个代码片段,我都在主应用程序和框架中尝试过——我知道这不会有任何区别,但我想涵盖我的基础。我不能让它工作来救我的命

class BrokenButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            print("This is never called no matter what I do")
        }
    }
}
我尝试使用KVO查看isEnabled的值,因为覆盖setter不起作用:

class BrokenButton2: UIButton {
    required init() {
        super.init(frame: .zero)
        addObserver(self, forKeyPath: #keyPath(isEnabled), options: [.new], context: nil)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
        print("Never called")
    }
}

我在这里束手无策。我错在哪里了?

我认为意义同样重要。下面是一些步骤,您可以采取这些步骤来重现它的工作方式。你可能错过了这些步骤中的任何一个

创建BrokenButton类,它是UIButton的子类。正如你在上面的问题中所做的那样

打开情节提要或xib,并将UIButton拖动到情节提要或xib中

选择刚才拖到情节提要/xib中的ui按钮,并在identify检查器中,确保将类设置为BrokenButton

在ViewController中创建一个插座,如下所示: @IBOUTLE弱var按钮:断开按钮

在故事板/xib的连接检查器中,将按钮连接到IBOutlet

然后在viewcontroller中,将按钮设置为启用或禁用,如下所示: 按钮?.isEnabled=true

在这里,它正在进行中


@Daniel由于BrokenButton类位于框架内部,因此需要使用open关键字从其他模块外部进行访问。因此,只需在BrokenButton类和isEnabled属性之前添加open关键字

open class BrokenButton: UIButton {
    override open var isEnabled: Bool {
        didSet {
            print("This is never called no matter what I do")
        }
    }
}
开放类在定义类之外是可访问的和可子类 单元开放类成员可在外部访问和重写 定义模块


有关open关键字的更多信息,请阅读stackoverflow答案

在类BrokenButton之前尝试使用open关键字,并启用覆盖属性。另外,如果您正在使用故事板或xib,请确保将子类类型更改为BrokenButton。是否尝试更改按钮的状态?e、 g.对于isSelected put按钮,isSelected=!button.i在按钮操作中选择,然后您的didSet开始识别状态更改。使用KVO时,您使用的是obj-c运行时。应启用isEnabled。brokenButton.observe\brokenButton 2.enabled,选项:[.new、.old、.initial]{button、Uin printDid set enabled\button.isEnabled}对我来说很好,就像你的didSet属性观察代码一样。@suhit,你能重新发布你的评论作为答案,这样我就可以接受它并关闭问题了吗?在添加“open”关键字时,编译器对我很恼火,并要求进行其他几项更改,在我更新类以符合要求后,我开始点击我添加到didSet的断点。如何调用isEnabled?这不可能是正确的,因为按钮的其他行为确实发生了。打印构造函数工作中的语句,以及uicontrol事件“触地”、“触地内部”、“触地外部”和“触地取消”的我的观察者都可以正常工作。当我在我的类中以与本示例相同的方式重写“isEnabled”时,在didSet中使用print语句和断点,既不会命中print语句,也不会命中断点。我自己不会。此按钮旨在供我公司内遵循设计指南的工程师使用。这样做的目的是,按钮可以配置一个图案名称,然后它将在所有状态下用正确的颜色表示自己正常、选中、禁用。我明白了,我误解了你的问题。在我看来,你们真正想要的是得到这张照片,无论我做什么,这张照片都不会被调用。我仍然不完全理解,但似乎你已经根据你的其他评论找到了答案。