Swift Как элегантно обработать несколько кнопок пользовательского интерфейса? - PullRequest
1 голос
/ 21 июня 2019

В моем viewController мне нужно обработать пользовательский интерфейс кнопки

Я думаю, что мой подход к обработке пользовательского интерфейса неэффективен

Что если когда-нибудь мне понадобится еще кнопка?

Сегодня у меня всего три ... ..... 1007 *

Просто хочу, чтобы пользователь нажал одну из трех, а другие сохранили исходный цвет

, как, например, чтобы пользователь чувствовал, какую из них нажимать во многих кнопках

Вот мой @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
        }
    }

И расширение My 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 Ответ

1 голос
/ 21 июня 2019

Вы можете просто создать Outlet Collection для всех buttons вместо явного создания array из 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()
        }
    }
}

Примечание: Кроме того, нет необходимости проходить array дважды.One single traversal будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...