轻松禁用多个按钮?

时间:2016-01-21 20:02:27

标签: ios swift uibutton

有什么简单的方法可以做到这一点吗?我们说我有10个不同的按钮和一个文本框。

@IBOutlet var button1: UIButton!
@IBOutlet var button2: UIButton!
@IBOutlet var button3: UIButton!
@IBOutlet var button4: UIButton!
@IBOutlet var button5: UIButton!
@IBOutlet var button6: UIButton!
@IBOutlet var button7: UIButton!
@IBOutlet var button8: UIButton!
@IBOutlet var button9: UIButton!
@IBOutlet var button10: UIButton!

如果textBox.text是" bt1",我只想启用button1,并禁用其余的,如果textbox.text是" bt2",我想只启用button2,并禁用其余的,依此类推......

3 个答案:

答案 0 :(得分:1)

您可以创建IBOutletCollection UIButton

然后像这样访问它们:

button[0].enabled = false

遍历数组以禁用所有按钮。

答案 1 :(得分:1)

更新:

根据我的理解,您希望根据输入到textField中的某些文本启用/禁用按钮。我假设您有一个从textField委托方法之一调用的方法。 我还假设从你输入的文本到按钮有1到1的映射,即用户必须输入“btn1” - 他们不能做“button1”或“按钮1”或任何其他变化。这是一个非常奇怪的要求 - 你确定这是你真正想要的吗?

首先,像以前一样将按钮放在'IBOutlet'集合中:

 @IBOutlet var allButtons : [UIButton]!

然后,使用枚举将文本框文本映射到集合中按钮的索引

enum ButtonMapping : String {
  case button1 = "btn1"
  case button2 = "btn2"
//and so on

  func buttonIndex() -> Int {
    switch(self) {
        case button1: return 0
        case button2: return 1
        //and so on
    }
  }
}

然后做一些像:

func disableButtonsForText(text:String) {
  if let mapping = ButtonMapping(rawValue:text) {
    let activeButton = allButtons[mapping.buttonIndex]
      for button in allButtons {
        if button != activeButton {
          button.enabled = false
        }
      }
   } 
}

当let绑定成功时,即当提供给ButtonMapping构造函数的字符串是有效按钮名称时,这将改变按钮 的状态。在所有其他情况下,按钮的状态不会改变。如果文本无法识别,您可能需要考虑添加else子句以将按钮状态重置为正常 - 不确定您在此处想要什么。

答案 2 :(得分:1)

请注意,您不一定要创建按钮数组。作为替代方案 - 鉴于这些是View Controller中的所有按钮 - 您可以使用Mirror(reflecting: ...

/* ViewController.swift */
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!
    @IBOutlet weak var button2: UIButton!
    @IBOutlet weak var button3: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        button1.enabled = true
        button2.enabled = true
        button3.enabled = true
        setEnableValueForAllButtons(false, exceptForButton: "button2")

        print(button1.enabled)
        print(button2.enabled)
        print(button3.enabled)

        /* button1.enabled = false
           button2.enabled = true
           button3.enabled = false */
    }

    func setEnableValueForAllButtons(toValue: Bool, exceptForButton: String) {
        let buttons = Mirror(reflecting: self).children.filter { $0.value is UIButton && ($0.label ?? "") != exceptForButton}
        for button in buttons {
            (button.value as? UIButton)?.enabled = toValue
        }
    }
}

如果您只想在文本字段中显示其属性名称输入的按钮,您只需将上面的示例扩展为包含文本字段,然后从setEnableValueForAllButtons(...)调用UITextFieldDelegate函数方法textFieldShouldReturn(因此在文本字段中输入字符串后按回车键后),如下所示:

/* ViewController.swift */
import UIKit    
class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var button1: UIButton!
    @IBOutlet weak var button2: UIButton!
    @IBOutlet weak var button3: UIButton!        
    @IBOutlet weak var textBox: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        button1.enabled = false
        button2.enabled = false
        button3.enabled = false

        textBox.delegate = self
    }

    func setEnableValueForAllButtons(toValue toValue: Bool, exceptForButton: String) {
        let buttons = Mirror(reflecting: self).children.filter { $0.value is UIButton && ($0.label ?? "") != exceptForButton}
        for button in buttons {
            (button.value as? UIButton)?.enabled = toValue
        }
    }

     // UITextFieldDelegate
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()

        setEnableValueForAllButtons(toValue: true, exceptForButton: "")
        setEnableValueForAllButtons(toValue: false, exceptForButton: textField.text ?? "")

        return true
    }
}

如果您使用触发器"bt1""bt2"等非常重要,则可以将按钮出口的名称重命名为这些值。

enter image description here