我试图实现的是在用户按下登录按钮后禁用登录屏幕上的所有元素。我创建了一个简单的函数,它保留了应该禁用的所有元素的数组。
func disableElements() {
let elements: [AnyObject] = [usernameInput, passwordInput, loginBtn]
for element in elements {
element.isEnabled = false // ERROR: Cannot assign to property: 'element' is a 'let' constant
}
}
我发现了一个类似的问题("Cannot assign to property: "any" is immutable" error),其中OP只能将数组类型从AnyObject
更改为UIImageView
,但如果数组中有不同的类型会怎么样? (就像在我的情况下UITextField
和UIButton
s)?
答案 0 :(得分:3)
他能够将数组类型从AnyObject更改为UIImageView,但如果数组中有不同的类型(如我的情况下为UITextFields和UIButtons
)
好吧,如果数组中有不同类型的东西,你只需要找到所有类型的最近共同祖先。共同的祖先,我的意思是两个类都继承自的超类。
在这种情况下,您有UITextField
和UIButton
。它们最近的祖先是UIControl
,它具有isEnabled
属性。
因此,您应该使用UIControl
作为数组的类型。
func disableElements() {
let elements: [UIControl] = [usernameInput, passwordInput, loginBtn]
elements.forEach { $0.isEnabled = false }
}
以下是"关系" UIButton
和UITextField
的部分:
https://developer.apple.com/documentation/uikit/uibutton#relationships
https://developer.apple.com/documentation/uikit/uitextfield#relationships
答案 1 :(得分:2)
isEnabled
属性来自UIControl
。 UIButton
和UITextField
都延伸UIControl
。因此,请将数组设为UIControl
的数组,而不是AnyObject
的数组。
func disableElements() {
let elements: [UIControl] = [usernameInput, passwordInput, loginBtn]
for element in elements {
element.isEnabled = false
}
}
答案 2 :(得分:0)
创建一个布尔值,即:fileprivate var allowUserToInteractWithElements = true
,当按下登录按钮时,将其设置为false。
在您的按钮的IBAction中,以及在UITextfieldShouldBeginEditing委托方法中,将此布尔值用作条件。在我看来,这是处理按钮/文本字段禁用的更好方法。
例如:
@IBAction func buttonPressed(_ sender: Any) {
if (allowUserToInteractWithElements) {
//Do action
}
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (allowUserToInteractWithElements) {
return false
}else{
return true
}
}