【问题标题】:Using Multiple Cases in a Switch Statement在 switch 语句中使用多个 case
【发布时间】:2021-02-19 19:21:39
【问题描述】:

我正在尝试在三个按钮操作上使用 switch 语句,用户可以在早上、下午和晚上时间之间进行选择。我想根据选择的按钮更改背景和文本颜色。

现在我的按钮没有根据点击而改变,我需要做什么才能让它工作?另外,在其中一种情况下,我如何使用标签 10 和标签 20?谢谢。

// 我的按钮

    private lazy var morningButton: TimeButton = {
        let button = TimeButton(type: .system)
        button.setTitle("Morning", for: .normal)
        button.titleLabel?.font = UIFont(name: "AvenirNext-Medium", size: 14)
        return button
    }()
    
    private lazy var afternoonButton: TimeButton = {
        let button = TimeButton(type: .system)
        button.setTitle("Afternoon", for: .normal)
        button.titleLabel?.font = UIFont(name: "AvenirNext-Medium", size: 14)
        return button
    }()
    
    private lazy var eveningButton: TimeButton = {
        let button = TimeButton(type: .system)
        button.setTitle("Evening", for: .normal)
        button.titleLabel?.font = UIFont(name: "AvenirNext-Medium", size: 14)
        return button
    }()

// 切换语句

@objc func timeButtonsTapped(_ sender: TimeButton) {
        
        switch sender.tag {
        case 10:
            morningButton.backgroundColor = .darkPurpleTint
            morningButton.setTitleColor(.white, for: .normal)
            afternoonButton.backgroundColor = .white
            afternoonButton.setTitleColor(.darkPurpleTint, for: .normal)
            eveningButton.backgroundColor = .white
            eveningButton.setTitleColor(.darkPurpleTint, for: .normal)
        case 20:
            afternoonButton.backgroundColor = .darkPurpleTint
            afternoonButton.setTitleColor(.white, for: .normal)
            morningButton.backgroundColor = .white
            morningButton.setTitleColor(.darkPurpleTint, for: .normal)
            eveningButton.backgroundColor = .white
            eveningButton.setTitleColor(.darkPurpleTint, for: .normal)
        case 30:
            eveningButton.backgroundColor = .darkPurpleTint
            eveningButton.setTitleColor(.white, for: .normal)
            morningButton.backgroundColor = .white
            morningButton.setTitleColor(.darkPurpleTint, for: .normal)
            afternoonButton.backgroundColor = .white
            afternoonButton.setTitleColor(.darkPurpleTint, for: .normal)
        case 10 & 20:
            morningButton.backgroundColor = .darkPurpleTint
            morningButton.setTitleColor(.white, for: .normal)
            afternoonButton.backgroundColor = .darkPurpleTint
            afternoonButton.setTitleColor(.white, for: .normal)
            eveningButton.backgroundColor = .white
            eveningButton.setTitleColor(.darkPurpleTint, for: .normal)
        case 10 & 30:
            morningButton.backgroundColor = .darkPurpleTint
            morningButton.setTitleColor(.white, for: .normal)
            eveningButton.backgroundColor = .darkPurpleTint
            eveningButton.setTitleColor(.white, for: .normal)
            afternoonButton.backgroundColor = .white
            afternoonButton.setTitleColor(.darkPurpleTint, for: .normal)
        case 20 & 30:
            afternoonButton.backgroundColor = .darkPurpleTint
            afternoonButton.setTitleColor(.white, for: .normal)
            eveningButton.backgroundColor = .darkPurpleTint
            eveningButton.setTitleColor(.white, for: .normal)
            morningButton.backgroundColor = .white
            morningButton.setTitleColor(.darkPurpleTint, for: .normal)
        case 10 & 20 & 30:
            morningButton.backgroundColor = .darkPurpleTint
            morningButton.setTitleColor(.white, for: .normal)
            afternoonButton.backgroundColor = .darkPurpleTint
            afternoonButton.setTitleColor(.white, for: .normal)
            eveningButton.backgroundColor = .darkPurpleTint
            eveningButton.setTitleColor(.white, for: .normal)
        default:
            morningButton.backgroundColor = .white
            morningButton.setTitleColor(.darkPurpleTint, for: .normal)
            afternoonButton.backgroundColor = .white
            afternoonButton.setTitleColor(.darkPurpleTint, for: .normal)
            eveningButton.backgroundColor = .white
            eveningButton.setTitleColor(.darkPurpleTint, for: .normal)
        }
        
    }

// 我的功能

fileprivate func configureUI() {

        morningButton.tag = 10
        morningButton.isUserInteractionEnabled = true
        afternoonButton.tag = 20
        afternoonButton.isUserInteractionEnabled = true
        eveningButton.tag = 30
        eveningButton.isUserInteractionEnabled = true
        
        morningButton.addTarget(self, action: #selector(timeButtonsTapped(_:)), for: .touchUpInside)
        afternoonButton.addTarget(self, action: #selector(timeButtonsTapped(_:)), for: .touchUpInside)
        eveningButton.addTarget(self, action: #selector(timeButtonsTapped(_:)), for: .touchUpInside)

}

【问题讨论】:

  • case 10 & 20 是什么意思? timeButtonsTapped 每按下一个按钮就会被调用一次,所以如果用户同时按下两个按钮,它会被调用两次。你要区分“同时按下 2 个按钮”和“一个接一个地按下 2 个按钮”吗?
  • 就像我希望上午和下午的按钮根据用户是否一个接一个地点击而改变。换句话说,如果点击上午和下午的按钮,则会有紫色背景和白色文字。
  • 那么你就不需要将其他按钮的背景设置为每种情况下的白色(只需将所需的按钮背景设置为紫色),你只需要前3种情况。
  • 好的,那么下一个问题是我的目标没有开火。我应该使用 UITapGestureRecognizers 吗?

标签: ios swift uibutton switch-statement


【解决方案1】:

您不需要将按钮着色逻辑分布在您的视图控制器中。这会导致大量的代码重复和未来的可维护性差。

UIButton 有一个isSelected 属性,您可以在这种特殊情况下使用它来保存按钮的状态。另外我建议将所有颜色移动到按钮的子类中,这样客户就不必担心它们了。该按钮应负责切换其颜色。

TimeButton 类如下所示:

class TimeButton: UIButton {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setup()
    }
    
    override var isSelected: Bool {
        didSet {
            updateBackgroundColor()
        }
    }
    
    // MARK: - Private
    private func setup() {
        translatesAutoresizingMaskIntoConstraints = false
        setTitleColor(.white, for: .normal)
        setTitleColor(.systemPurple, for: .selected)
        titleLabel?.font = UIFont(name: "AvenirNext-Medium", size: 14)
        updateBackgroundColor()
    }
    
    private func updateBackgroundColor() {
        backgroundColor = isSelected ? .white : .systemPurple
    }
}

您的视图控制器现在应该如下所示:

class ViewController: UIViewController {
    private lazy var morningButton: TimeButton = {
        let button = TimeButton(type: .custom)
        button.setTitle("Morning", for: .normal)
        button.addTarget(self, action: #selector(didSelectButton(_:)), for: .touchUpInside)
        return button
    }()
    
    private lazy var afternoonButton: TimeButton = {
        let button = TimeButton(type: .custom)
        button.setTitle("Afternoon", for: .normal)
        button.addTarget(self, action: #selector(didSelectButton(_:)), for: .touchUpInside)
        return button
    }()
    
    private lazy var eveningButton: TimeButton = {
        let button = TimeButton(type: .custom)
        button.setTitle("Evening", for: .normal)
        button.addTarget(self, action: #selector(didSelectButton(_:)), for: .touchUpInside)
        return button
    }()
    
    @objc private func didSelectButton(_ button: TimeButton) {
        button.isSelected = !button.isSelected
        // do some additional stuff if needed
    }
}

注意按钮初始化中的type: .custom - 这将在选择按钮时禁用默认按钮样式。

如果您想获取某个按钮的值 - 只需参考其isSelected 属性:

let shouldUseMorningTime = morningButton.isSelected

【讨论】:

  • 另外,理想情况下我们应该使用背景图片而不是背景颜色。那么切换会更简单。我不确定按钮使用内部操作在内部管理isSelected 是否是个好主意。这通常应该在外部完成。
  • @Sulthan 你说得对,谢谢你的评论。将动作设置移动到视图控制器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2013-09-24
  • 2014-11-10
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多