Swift 4-为多个按钮创建通用功能

时间:2018-10-24 17:33:35

标签: swift struct uibutton func

我想知道是否有更有效的方法来编码与按下相同的按钮以及它所涉及的结构中的项目相同的动作。基本上,我有10个变量的结构,所有这些都是布尔类型,我有10个按钮。当用户按下按钮时,我想检查它是否已经被按下(使用struct),然后根据状态更改按钮的背景并反转状态。我已经复制了其中一个按钮的当前代码,但认为应该可以避免执行10次此操作!

@IBAction func architectureButtonPressed(_ sender: Any) {

        if myInterests.architecture {

             myInterests.architecture = false
             architectureButton.setBackgroundImage(imageUncheckedNarrow, for: .normal)

        } else {

            myInterests.architecture = true
            architectureButton.setBackgroundImage(imageCheckedNarrow, for: .normal)
        }


    }

3 个答案:

答案 0 :(得分:1)

一种简单的方法是使每个UIButton指向相同的ArchitectureButtonPressed IBAction方法。由于按下的按钮已传递到方法(发送方)中,因此您可以查阅其tag属性以了解应更新结构中哪个字段的索引。 (然后,您可能希望将结构更改为仅存储10个布尔数组,但是由您自己决定)。

然后,对于每个UIButton,无论是在情节提要中还是在记事本中以编程方式,都需要为按钮的标记字段分配适当的索引值。

答案 1 :(得分:0)

  1. 为每个按钮创建IBOutlet

  2. 创建一个数组并存储所有按钮,例如:var arrayButtons : [UIButton] = []

    arrayButtons.append [button1]

    arrayButtons.append [button2]

    ...

  3. 创建一个布尔数组来存储true/falsevar arrayBools : [Bool] = []并初始化一些值。

请注意,arrayButtons和arrayBools的索引必须相同。

  1. 创建选择器功能以监听触摸按钮。

    button.addTarget(self, action: #selector(my_func), for: .touchUpInside)
    
    @objc func my_func(_ sender : UIButton) {
    
    for i in 0...arrayButtons.size-1 {
        if arrayButtons[i] == sender {
            if arrayBooleans[i] {
                arrayBooleans[i] = false
                arrayButtons[i].setImage()
            } else {
                arrayBooleans[i] = true
                arrayButtons[i].setImage()
            }
        }
      }
    }
    

答案 2 :(得分:0)

我的建议是通过State Config(Default / Selected)在Interface Builder中管理图像

然后为每个按钮分配一个从100开始的唯一标记,并在isSelected语句中将IBAction中的switch值设置为相应的struct成员:

@IBAction func buttonPressed(_ sender: UIButton) {
    switch sender.tag {
    case 100: myInterests.architecture = sender.isSelected
    case 101: myInterests.art = sender.isSelected

    ...
    default: break
    }

}

或者将Swift的本机KVC与WriteableKeypath一起使用

let keypaths : [WritableKeyPath<Interests,Bool>] = [\.architecture, \.art, \.fashion, \.history, \.localCulture, \.music, \.nature, \.shopping, \.sport, \.anything]

@IBAction func buttonPressed(_ sender: UIButton) {
    let index = sender.tag - 100
    let keypath = keypaths[index]
    myInterests[keyPath: keypath] = sender.isSelected
}