Swift 中 MacOS 的互斥单选按钮
Mutually exclusive radio buttons for MacOS in Swift
我有五个单选按钮,select应该删除一个 select 其他按钮。
我在这里回答了很多关于 Swift 中的单选按钮的问题,但它们要么是针对 iOS 的,要么是 Swift 的过时版本,因为 Xcode 没有提供像“.isSelected”这样的选项。我有“.isEnabled”,但显然这里的语义很重要,因为 "enabled" 与 "selected" 不同,它显示了。
将我的代码编写为一系列 "if-else" 语句:
func disableUnselectedButtons() {
if Button2.isEnabled == true {
Button1.isEnabled = false
Button3.isEnabled = false
Button4.isEnabled = false
Button5.isEnabled = false
}
}
导致我可以 select 所有五个按钮,但不能 DEselect 一个接一个地 selected。我也尝试过 .on/.off 的变体,但找不到适合这种情况的变体。
用五个 if-else 语句来编写一个方法也很笨拙。就是这样。
执行此操作的最佳方法是什么?
如果您的单选按钮具有相同的超级视图并具有相同的操作,那么它们应该可以按预期工作。
要为每个单选按钮设置相同的操作,您可以执行以下操作之一。
如果您正在使用故事板,请打开故事板和相关的 NSViewController swift 文件。按住 Ctrl 键将您的第一个单选按钮拖到 swift 文件中。然后对每个其他单选按钮执行相同操作,确保您拖动到第一个 Ctrl-拖动生成的函数上。
如果您在代码中创建单选按钮,请在 init
中为每个单选按钮设置相同的操作参数。
解决这个问题的另一种方法是将按钮表示为一个集合,然后很容易遍历它们并配置它们的状态。下面的代码实际上允许允许多个选择以支持想要 "select three of the six options".
的场景
let allButtons = Set(1...5). //or however many you want
func selectActiveButtons(_ activeButtons: Set<Int>, from allButtons: Set<Int>){
let inactive = allButtons.subtracting(activeButtons)
setButtonState(forButtons: inactive, isSelected: false)
setButtonState(forButtons: activeButtons, isSelected: true)
}
func setButtonState(forButtons buttons: Set<Int>, isSelected: Bool) {
buttons.forEach{
//remove below line and replace with code to update buttons in UI
print("Button \([=10=]): \(isSelected ? "Selected" : "Unselected")")
}
}
// select buttons 1 & 3.
//If wanting a "classic" radio button group just use one value in the arrayLiteral.
selectActiveButtons(Set(arrayLiteral: 1,3), from: allButtons)
我有五个单选按钮,select应该删除一个 select 其他按钮。
我在这里回答了很多关于 Swift 中的单选按钮的问题,但它们要么是针对 iOS 的,要么是 Swift 的过时版本,因为 Xcode 没有提供像“.isSelected”这样的选项。我有“.isEnabled”,但显然这里的语义很重要,因为 "enabled" 与 "selected" 不同,它显示了。
将我的代码编写为一系列 "if-else" 语句:
func disableUnselectedButtons() {
if Button2.isEnabled == true {
Button1.isEnabled = false
Button3.isEnabled = false
Button4.isEnabled = false
Button5.isEnabled = false
}
}
导致我可以 select 所有五个按钮,但不能 DEselect 一个接一个地 selected。我也尝试过 .on/.off 的变体,但找不到适合这种情况的变体。
用五个 if-else 语句来编写一个方法也很笨拙。就是这样。
执行此操作的最佳方法是什么?
如果您的单选按钮具有相同的超级视图并具有相同的操作,那么它们应该可以按预期工作。
要为每个单选按钮设置相同的操作,您可以执行以下操作之一。
如果您正在使用故事板,请打开故事板和相关的 NSViewController swift 文件。按住 Ctrl 键将您的第一个单选按钮拖到 swift 文件中。然后对每个其他单选按钮执行相同操作,确保您拖动到第一个 Ctrl-拖动生成的函数上。
如果您在代码中创建单选按钮,请在 init
中为每个单选按钮设置相同的操作参数。
解决这个问题的另一种方法是将按钮表示为一个集合,然后很容易遍历它们并配置它们的状态。下面的代码实际上允许允许多个选择以支持想要 "select three of the six options".
的场景let allButtons = Set(1...5). //or however many you want
func selectActiveButtons(_ activeButtons: Set<Int>, from allButtons: Set<Int>){
let inactive = allButtons.subtracting(activeButtons)
setButtonState(forButtons: inactive, isSelected: false)
setButtonState(forButtons: activeButtons, isSelected: true)
}
func setButtonState(forButtons buttons: Set<Int>, isSelected: Bool) {
buttons.forEach{
//remove below line and replace with code to update buttons in UI
print("Button \([=10=]): \(isSelected ? "Selected" : "Unselected")")
}
}
// select buttons 1 & 3.
//If wanting a "classic" radio button group just use one value in the arrayLiteral.
selectActiveButtons(Set(arrayLiteral: 1,3), from: allButtons)