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)