Swift如何优雅地处理多个按钮UI?

时间:2019-06-21 08:36:48

标签: swift

在我的viewController中,我需要处理按钮UI

我认为我处理UI的方法效率不高

如果有一天我需要做更多按钮怎么办?

今天我刚好只有三个.....

只需要用户按三个中的一个,其他则保持原始颜色

让用户感觉到他们按下了多个按钮

这是我的@IBAction

@IBAction func btnPress (_ sender: UIButton) {
        let clickedBackgroundColor = UIColor(red: 1, green: 153, blue: 202, a: 1)
        let clickedTextColor = UIColor(red: 255, green: 255, blue: 255, a: 1)
        let originBackgroundColor = UIColor(red: 216, green: 247, blue: 250, a: 1)
        let originTextColor = UIColor(red: 0, green: 71, blue: 88, a: 1)

        switch sender {
        case btnA:
            btnA.backgroundColor = clickedBackgroundColor
            btnA.setTitleColor(clickedTextColor, for: .normal)
            btnA.underline()

            btnB.backgroundColor = originBackgroundColor
            btnB.setTitleColor(originTextColor, for: .normal)
            btnC.backgroundColor = originBackgroundColor
            btnC.setTitleColor(originTextColor, for: .normal)


        case btnB:
            btnB.backgroundColor = clickedBackgroundColor
            btnB.setTitleColor(clickedTextColor, for: .normal)
            btnB.underline()

            btnA.backgroundColor = originBackgroundColor
            btnA.setTitleColor(originTextColor, for: .normal)
            btnC.backgroundColor = originBackgroundColor
            btnC.setTitleColor(originTextColor, for: .normal)


        case btnC:
            btnC.backgroundColor = clickedBackgroundColor
            btnC.setTitleColor(clickedTextColor, for: .normal)
            btnC.underline()

            btnA.backgroundColor = originBackgroundColor
            btnA.setTitleColor(originTextColor, for: .normal)
            btnB.backgroundColor = originBackgroundColor
            btnB.setTitleColor(originTextColor, for: .normal)

        default:break
        }
    }

还有我的UIButton扩展,用于添加下划线

我只能添加下划线,但是如果用户单击其他按钮,如何将其删除?

extension UIButton {
    func underline() {
        guard let text = self.titleLabel?.text else { return }
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: text.count))
        self.setAttributedTitle(attributedString, for: .normal)
    }
}

我真的很新,不擅长询问是否需要更多信息,请问我。

1 个答案:

答案 0 :(得分:1)

您只需为所有Outlet Collection创建一个 buttons ,而不是显式创建array的{​​{1}}并使用它来设置{根据选择的{1}}属性,即

buttons

用法:

button's

注意:此外,也不需要遍历@IBOutlet var buttons: [UIButton]! 两次。 @IBAction func btnPress (_ sender: UIButton) { let clickedBackgroundColor = UIColor(red: 1, green: 153, blue: 202, a: 1) let clickedTextColor = UIColor(red: 255, green: 255, blue: 255, a: 1) let originBackgroundColor = UIColor(red: 216, green: 247, blue: 250, a: 1) let originTextColor = UIColor(red: 0, green: 71, blue: 88, a: 1) buttons.forEach { (button) in button.backgroundColor = (button == sender) ? clickedBackgroundColor : originBackgroundColor button.setTitleColor((button == sender) ? clickedTextColor : originTextColor, for: .normal) if button == sender { button.underline() } } } 可以正常工作。