[英]Alternative pattern to switch statement with enum and if statement for many different cases
[英]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.