gpt4 book ai didi

ios - Storyboard 中设置的 @IBInspectable 的值未传播到代码

转载 作者:行者123 更新时间:2023-11-28 05:58:57 25 4
gpt4 key购买 nike

在没有任何 iOS 经验的情况下,我被要求将一个使用 Swift 3 的应用程序升级到 Swift 4。我更新了在“Swift 语言版本”中使用的语言,并且我遵循了 xCode 提出的建议(明确使用 @objc).

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

此变量的值已在 MainStoryboard 中正确设置,但当类被实例化时,此值未设置为 Storyboard 中的值,因此,自定义文本字段未按应有的方式运行。日志没有提及任何错误。

有人遇到同样的问题吗?

我检查了 Storyboard和类,我没有发现任何问题,我也比较了 Swift 3 版本的代码和我更新的 Swift 4 的代码,没有区别(除了 @objc一个)。

是否还有其他内容可以帮助我找到为什么 MainStoryboard 中设置的值未传播到类?

编辑

问题涉及的代码如下:

  • 声明一个变量isPassword来反射(reflect)IBInspectable变量的值
  • 声明变量IBInspectable
  • awakeFromNib 根据 isPassword 的值调用隐藏文本或不隐藏文本的方法时

    @IBDesignable class CustomEditText: UITextField {
    var isPassword = false

    // 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
    }
    }

...

回答

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

@IBInspectable var isPasswordField: Bool = false {
didSet{
self.isPassword = isPasswordField

if isPassword {
self.isSecureTextEntry = true
setRevealButton()
} else {
setCustomClearButton()
}
}
}

最佳答案

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

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

set {
self.isPassword = newValue
}
}

因为实际值尚未(也不会 - 至少“直接”)在 isAPasswordField 上设置(请记住,我们正在实现计算的 setter毕竟属性(property)......)

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


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

关于ios - Storyboard 中设置的 @IBInspectable 的值未传播到代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50485026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com