禁用UIButtons和UITextFields数组

时间:2017-09-11 15:17:14

标签: ios swift

我试图实现的是在用户按下登录按钮后禁用登录屏幕上的所有元素。我创建了一个简单的函数,它保留了应该禁用的所有元素的数组。

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,但如果数组中有不同的类型会怎么样? (就像在我的情况下UITextFieldUIButton s)?

3 个答案:

答案 0 :(得分:3)

  

他能够将数组类型从AnyObject更改为UIImageView,但如果数组中有不同的类型(如我的情况下为UITextFields和UIButtons

好吧,如果数组中有不同类型的东西,你只需要找到所有类型的最近共同祖先。共同的祖先,我的意思是两个类都继承自的超类。

在这种情况下,您有UITextFieldUIButton。它们最近的祖先是UIControl,它具有isEnabled属性。

enter image description here

因此,您应该使用UIControl作为数组的类型。

func disableElements() {
    let elements: [UIControl] = [usernameInput, passwordInput, loginBtn]

    elements.forEach { $0.isEnabled = false }
}

以下是"关系" UIButtonUITextField的部分:

https://developer.apple.com/documentation/uikit/uibutton#relationships

https://developer.apple.com/documentation/uikit/uitextfield#relationships

答案 1 :(得分:2)

isEnabled属性来自UIControlUIButtonUITextField都延伸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
    }
}