没有任何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
}
}
...
答案 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
}
}