【问题标题】:IBDesignable for UIButton, IBInspectable vars are nilUIButton 的 IBDesignable,IBInspectable 变量为零
【发布时间】:2019-04-03 04:31:45
【问题描述】:

我在使用 UIButton 时遇到了一个奇怪的问题。我有以下自定义类:

import UIKit

@IBDesignable class ToggleButton: UIButton {

    @IBInspectable var state1Image: UIImage = UIImage()
    @IBInspectable var state2Image: UIImage = UIImage()
    @IBInspectable var someString: String = ""

    private var toogleOn: Bool = false {
        didSet {
            if toogleOn {
                isSelected = true
            } else {
                isSelected = false
            }
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }


    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    private func setup() {
        print("test")
        print("some string is \(someString)")
    }

    @objc func didToggleButton() {
        toogleOn = !toogleOn
    }

}

在界面生成器中,我设置了可检查变量,假设我将someString 设置为 hello。现在,当我运行应用程序并查看日志时,var 的print""。我也无法设置图像。它只使用默认值,不会使用我设置的新值。我在这里做错了什么?

【问题讨论】:

    标签: uibutton ibdesignable ibinspectable


    【解决方案1】:

    试试这个:

    @IBDesignable class ToggleButton: UIButton {
    @IBInspectable var state1Image: UIImage = UIImage() {
        didSet {
            setup()
        }
    }
    @IBInspectable var state2Image: UIImage = UIImage() {
        didSet {
            setup()
        }
    }
    @IBInspectable var someString: String = "" {
        didSet {
            setup()
        }
    }
    
    override func prepareForInterfaceBuilder() {
        setup()
    }
    
    private func setup() {
        print("test")
        // Updating title label as someString to see the update
        self.titleLabel?.text =  someString
    }
    
    private var toogleOn: Bool = false {
        didSet {
            if toogleOn {
                isSelected = true
            } else {
                isSelected = false
            }
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    
    @objc func didToggleButton() {
        toogleOn = !toogleOn
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多