NSButton RadioGroup(NSMatrix 替代方案)

NSButton RadioGroup (NSMatrix Alternative)

我试过几次设置几个类似的按钮,都连接到相同的 IBAction,但似乎仍然无法复制 RadioButton 行为。

目前,我有 5 个按钮,所有 children 个 NSView..

NSView
    - ButtonOne - NSButton (Square Button)
    - ButtonTwo - NSButton (Square Button)
    - ButtonThree - NSButton (Square Button)
    - ButtonFour - NSButton (Square Button)
    - ButtonFive - NSButton (Square Button)

它们都连接到一个通用的 IBAction,其内容如下:

@IBAction func activityButtonPressed(sender: NSButton) {

    println("\(sender.title) Pressed")

}

这对捕获实际的 mosueDown 事件并将其发送到 func(如预期的那样)有效..

如何让它们在单选按钮模式下工作?也就是说,当点击各种按钮时,它们的 NSOnState 和 NSOffState 会切换吗?

当我尝试将按钮类型更改为单选按钮时,它会自动翻转回 "Switch"...

干杯,

一个

我相信您正在寻找 NSMatrix:

您可以根据需要配置任意多的行和列:

然后您可以选择是允许单选还是多选:

您可以使用 sender.selectedColumnsender.selectedRow

的任意组合在 IBAction 中捕获选择

因为您特别不想使用 NSMatrix... 第一个问题是,如果您使用的是 方形按钮样式 ,则不能使用 radio 类型 。您想在 Interface Builder 中使用 On Off 类型

这是我用来测试 4 个按钮的代码:

var buttonList : [NSButton] {
    return [button1, button2, button3, button4]
}

@IBAction func buttonPressed(sender: NSButton) {
    buttonList.forEach {
        [=10=].state = [=10=] == sender ? .on : .off
    }
}

如您所见,它遍历所有按钮,测试是否是按下的按钮。它会在关闭其他按钮的同时打开该按钮。 您需要从那里管理您想要的任何状态,或者通过检查所有按钮的状态:

func whichButton() -> ActivityState {
   if button1.state == .on { return .one }
   if button2.state == .on { return .two }
   ...
}

其中 ActivityState.one 是一些枚举案例,您可以使用它来确定您所处的状态。

只需为 NSRadioButton 提供相同的超级视图和操作即可。正如 Good Doug 在他的回答中指出的那样,

[…] if you are using square button style, you can't use radio type. You want to use the On Off type in Interface Builder.

我真的不认为你想让你的操作方法设置组中所有按钮的状态......让 AppKit 为你做。

来自OS X Developer Release Notes: Cocoa Application Framework (10.10 and Earlier)

An NSButton configured as a radio button (with the -buttonType set to NSRadioButton), will now operate in a radio button group for applications linked on 10.8 and later. To have the button work in a radio group, use the same -action for each NSButton instance, and have the same superview for each button. When these conditions are met, checking one button (by changing the -state to 1), will uncheck all other buttons (by setting their -state to 0).