故事板中的@IBInspectable集的值未传播到代码中

时间:2018-05-23 09:45:18

标签: ios swift swift4 ibinspectable

没有任何iOS经验,我被要求升级到使用Swift 3的Swift 4应用程序。我更新了用于“Swift语言版本”的语言,我遵循了xCode提出的建议(明确使用{ {1}})。

修复所有错误后,应用程序可以正常工作,但是一个与UI相关的功能不再起作用。该应用有一个用于输入密码的自定义@objc。根据自定义文本字段的UITextField类字段的值,文本是否隐藏。

此变量的值在MainStoryboard中正确设置,但是在实例化类时,此值未设置为情节提要中的值,因此自定义文本字段的行为不应该如此。日志没有提到任何错误。

有没有人遇到同样的问题?

我检查了故事板和课程,我没有发现任何问题,我还将版本的代码与Swift 3和我用Swift 4更新的代码进行了比较,没有差异(@IBInspectable除外) 。

是否还有其他东西可以帮助我找出为什么MainStoryboard中的值没有传播到类?

修改

以下是问题涉及的代码:

  • 声明变量@objc以反映IBInspectable变量的值
  • 声明变量isPassword
  • IBInspectable取决于awakeFromNib的值时,隐藏文字的方法被称为

    @IBDesignable class CustomEditText:UITextField {     var isPassword = false

    isPassword

答案

@Alladinian给出了很好的答案。 下面为了完整性,我找到了另一个解决方案:

// Inspector variable determining if the text must be hidden or not
@IBInspectable var isAPasswordField: Bool {
    get{
        return self.isPassword
    }

    set{
        self.isPassword = isAPasswordField
    }
}

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

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    setup()   // Set borders, font, ...
}

override func awakeFromNib() {
    super.awakeFromNib()
    if isPassword {               // isPassword does not reflect the value of isAPasswordField set in storyboard
        self.isSecureTextEntry = true
        setRevealButton()         // the text is hidden
    } else {
        setCustomClearButton()    // the text is not hidden
    }
}

...

2 个答案:

答案 0 :(得分:1)

正确的形式是(注意setter赋值):

@IBInspectable var isAPasswordField: Bool {
    get {
        return self.isPassword
    }

    set {
        self.isPassword = newValue
    }
}

因为isAPasswordField上没有设置实际值(且不会 - 至少'直接')(记住,我们实际上是在实现计算属性的setter) ...)

另外,为什么不直接使用isPassword将其标记为可检查,从而避免需要额外的ivar?

PS:newValue是待设置值的默认名称。您可以在Swift编程语言书籍中的Shorthand Setter Declaration部分阅读更多相关信息

答案 1 :(得分:0)

以下代码对我来说适用于较新的版本:

@IBInspectable var isAPass: Bool {
    get {
        return self.isSecureTextEntry
    }

    set {
        self.isSecureTextEntry = newValue
    }
}