Swift 中适用于 MacOS 的互斥单选按钮



我有五个单选按钮,选择一个应该取消选择其他按钮。

我在这里讨论了很多关于 Swift 中的单选按钮的问题,但它们要么适用于 iOS,要么适用于过时的 Swift 版本,因为 Xcode 没有为我提供".isSelected"等选项。我有".isEnabled",但显然语义在这里很重要,因为"启用"与"选择"不是一回事,它会显示。

将我的代码编写为一系列"if-else"语句,如下所示:

func disableUnselectedButtons() {
if Button2.isEnabled == true {
Button1.isEnabled = false
Button3.isEnabled = false
Button4.isEnabled = false
Button5.isEnabled = false
}
}

导致我可以选择所有五个按钮,并且在选择另一个按钮后无法取消选择其中任何一个按钮的情况。我也尝试了 .on/.off 的变体,但找不到适合这种情况的变体。

沿着这些思路编写一个带有五个 if-else 语句的方法也很笨拙。所以就是这样。

实现这一点的最佳方法是什么?

如果您的单选按钮具有相同的超级视图并具有相同的操作,则它们应按预期工作。

要为每个单选按钮设置相同的操作,您可以执行以下操作之一。

如果您使用的是情节提要,请同时打开情节提要和相关 NSViewController swift 文件。按住 Ctrl 键并将第一个单选按钮拖动到 swift 文件。然后对其他每个单选按钮执行相同的操作,确保您拖动到从第一个 Ctrl 拖动生成的函数上。

如果要在代码中创建单选按钮,则在init中为每个单选按钮设置相同的操作参数。

另一种方法是将按钮表示为 Set,然后可以轻松遍历它们并配置其状态。 下面的代码实际上允许多个选择来支持想要"选择六个选项中的三个"的方案。

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 ($0):  (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)

最新更新