有什么简单的方法可以做到这一点吗?我们说我有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,并禁用其余的,依此类推......
答案 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"
等非常重要,则可以将按钮出口的名称重命名为这些值。