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.selectedColumn
和 sender.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).
我试过几次设置几个类似的按钮,都连接到相同的 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.selectedColumn
和 sender.selectedRow
因为您特别不想使用 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).