簡體   English   中英

在 Switch 語句中使用多個 case

[英]Using Multiple Cases in a Switch Statement

我正在嘗試在三個按鈕操作上使用 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)

}

你不需要在你的視圖控制器上散布按鈕着色邏輯。 這導致了大量的代碼重復和未來的可維護性差。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM