在UIButton上覆盖'isSelected'或'isEnabled'不起作用

时间:2017-12-19 18:19:34

标签: ios swift uibutton key-value-observing

我正在尝试创建一个自定义UIButton子类,它在normalselecteddisabled状态下具有不同的颜色。我的按钮位于一个框架中,然后导入到一个应用程序中,但我放在这里的每个代码片段,我都在主应用程序和框架中尝试过 - 我知道它应该没有任何区别,但我想覆盖我的基地。我无法让它拯救我的生命。

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")
    }
}

我在这里结束了我的智慧。我对此有什么不妥?

2 个答案:

答案 0 :(得分:1)

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

<html>
  <head>
    <script type="text/javascript" src="localhost/ckeditor/ckeditor.js"></script> 
  </head>
  <body bgcolor=Bisque>

    <textarea class="ckeditor" id="body" name="body">
    Hii
    </textarea>

    <script type="text/javascript">
      CKEDITOR.replace('body');
    </script>
  </body>
</html>
  

开放类可以在定义之外访问和子类化   模块。开放类成员可以在外部访问和覆盖   定义模块。

有关open class BrokenButton: UIButton { override open var isEnabled: Bool { didSet { print("This is never called no matter what I do") } } } keyword..read this stackoverflow回答

的更多信息

答案 1 :(得分:0)

我认为与意义有关。您可以采取以下步骤来重现其工作方式。您可能错过了其中任何一个步骤。

  1. 创建BrokenButton类,它是UIButton的子类。正如您在上述问题中所做的那样。

  2. 打开storyboard或xib并将UIButton拖到故事板或xib中

  3. 选择您刚刚拖入storyboard / xib的UIButton,并在识别检查器中,确保您创建课程BrokenButton

  4. 在ViewController中创建一个这样的插座: @IBOutlet weak var button: BrokenButton?

  5. 在storyboard / xib中,连接检查器,将按钮连接到您的IBOutlet

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

  7. 此处正在进行中。enter image description here