NSButton 单选组(NSMatrix替代方案)

10

我已经尝试了几次设置几个类似的按钮,所有这些按钮都连接到相同的IBActions,但似乎仍无法复制单选按钮的行为。

目前,我有5个按钮,它们都是一个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事件并将其发送到该函数(如预期)。

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

当我尝试更改按钮类型为单选按钮时,它会自动翻转回“开关”...

谢谢,

A


https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Button/Concepts/RadioButtons.html - matt
1
使用了已经被弃用的NSMatrix。因此,我的标题是“NSMatrix替代方案”……请再次阅读问题… - Adrian Sluyters
6
当我在NSMatrix的头文件中阅读到这段话时,我的理解是错误的:“/* NSMatrix已被废弃,并将在未来版本中不再受支持。对于单选按钮分组,共享相同操作的兄弟单选按钮将以排他模式运行。*/” - Adrian Sluyters
2
在10.10版本的发布说明中 https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/ 阅读NSMatrix部分。 - Adrian Sluyters
1
只需将所有单选按钮连接到相同的目标/操作即可 - 这就是你需要做的。https://youtu.be/yaJPJdZZ6CM - wcochran
显示剩余5条评论
3个回答

11

只需将NSRadioButtons放在同一父视图并使用相同的action。正如Good Doug在他的回答中指出的那样,

[...]如果您正在使用方形按钮样式,则无法使用单选类型。您应该在Interface Builder中使用开/关类型。

我真的不认为您想要让您的操作方法设置组中所有按钮的状态……让AppKit替你完成这项工作。

来自OS X开发人员发布说明:Cocoa应用程序框架(10.10及更早版本)

一个被配置为单选按钮的NSButton(使用-buttonType设置为NSRadioButton),现在将在链接到10.8及更高版本的应用程序中以单选按钮组方式运行。要使按钮在单选组中工作,请为每个NSButton实例使用相同的-action,并具有相同的父视图。满足这些条件后,通过将-state更改为1来检查一个按钮,将取消选中其他所有按钮(通过将它们的-state设置为0)。


是的-- 这应该是被勾选的答案。只需将它们所有链接到同一个操作,就可以开始工作了!https://youtu.be/yaJPJdZZ6CM - wcochran
这对于常见情况很有效,但如果您像我一样在视图层次结构中使用自定义按钮进行非常复杂的操作,则@GoodDoug的答案更好。 - Ky -
我可以补充一下,“相同的父视图”条件在这里以及在苹果的文档中都稍微不完整。仅仅所有按钮具有相同的父视图是不够的 - 你必须在Interface Builder中显式地将它们嵌入到一个父视图中(例如,自定义视图或框)。如果你只是将两个按钮拖到同一个视图中并分配给它们相同的操作,那么它是行不通的。 - Leo Braun

8

由于您特别不想使用NSMatrix…… 第一个问题是,如果您正在使用正方形按钮样式,则无法使用单选类型。您需要在Interface Builder中使用开关类型

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

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

@IBAction func buttonPressed(sender: NSButton) {
    buttonList.forEach {
        $0.state = $0 == sender ? .on : .off
    }
}

正如您所看到的,它遍历所有按钮,测试它是否是被按下的按钮。它打开该按钮并关闭其他按钮。 您需要从那里管理任何想要的状态,或通过检查所有按钮的状态来管理:

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

其中ActivityState.one是枚举类型,用于确定当前所处的状态。


谢谢!我猜想苹果在NSMatrix头文件中留下的一般性注释对RadioMode来说有点太模糊了。但这正是我所需要的。 - Adrian Sluyters
3
如果所有单选按钮具有相同的目标/操作,则不需要任何管理,这样您就可以免费获得功能。 - wcochran

-5

我相信你正在寻找NSMatrix:enter image description here

你可以配置任意数量的行和列:enter image description here

然后,你可以选择允许单选或多选:enter image description here

你可以通过sender.selectedColumnsender.selectedRow的任意组合在你的IBAction中捕获所选内容。


这个答案不是NSMatrix的替代方案。 - Willeke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接