NSButton RadioGroup(NSMatrix Alternative)

时间:2015-05-29 13:00:55

标签: swift nsbutton

我已尝试过几次设置几个相似的按钮,所有这些按钮都连接到相同的IBActions,但仍然无法复制RadioButton行为。

目前,我有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事件并发送到func(如预期的那样)..

如何让他们在单选按钮模式下工作?即,在点击各种按钮时,它们的NSOnState和NSOffState是否会切换?

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

干杯,

A

4 个答案:

答案 0 :(得分:7)

只需给NSRadioButtons提供相同的superview和动作即可。正如Good Doug在他的回答中指出的那样,

  

[...]如果您使用方形按钮样式,则无法使用无线电类型。您想在Interface Builder中使用On Off类型。

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

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

  

配置为单选按钮的NSButton(-buttonType设置为NSRadioButton)现在将在10.8及更高版本上链接的应用程序的单选按钮组中运行。要使按钮在无线电组中工作,请对每个NSButton实例使用相同的-action,并为每个按钮使用相同的superview。满足这些条件时,选中一个按钮(通过将-state更改为1)将取消选中所有其他按钮(通过将其-state设置为0)。

答案 1 :(得分:6)

由于您特别不想使用NSMatrix ... 第一个问题是,如果您使用方形按钮样式,则无法使用无线电类型。您想在Interface Builder中使用 On Off type

以下是我用于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是一些枚举案例,可用于确定您所处的状态。

答案 2 :(得分:0)

没有第三方框架的替代解决方案,无需创建数组且没有任何重复循环。

  • 在Interface Builder中添加5个Radio Button个对象。
  • 为按钮分配标签,例如从100开始。
  • 将一个按钮的状态默认设置为ON,另一个按钮设置为OFF。
  • 在目标类中添加@IBOutlet变量并连接按钮。

    @IBOutlet weak var button1: NSButton!
    @IBOutlet weak var button2: NSButton!
    @IBOutlet weak var button3: NSButton!
    @IBOutlet weak var button4: NSButton!
    @IBOutlet weak var button5: NSButton!
    
  • 添加变量currentOnStateButton,其中包含对当前所选按钮的引用。

    weak var currentOnStateButton : NSButton!
    
  • viewDidLoad或类似的早期调用方法中,为currentOnStateButton变量指定默认按钮引用。

    currentOnStateButton = button1
    
  • 添加此activityButtonPressed IBAction方法并将所有按钮的操作连接到它,doActionForButtonx()方法是虚拟方法。

    @IBAction func activityButtonPressed(sender: NSButton) {
    
      currentOnStateButton.state = NSOffState
      sender.state = NSOnState
      currentOnStateButton = sender
      switch sender.tag {
        case 100: doActionForButton1()
        case 101: doActionForButton2()
        case 102: doActionForButton3()
        case 103: doActionForButton4() 
        case 104: doActionForButton5() 
        default : break
      }
    }
    

答案 3 :(得分:-3)

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

您可以根据需要使用尽可能多的行和列对其进行配置:enter image description here

然后,您可以选择是允许单个选项还是多种选择:enter image description here

您可以使用sender.selectedColumnsender.selectedRow

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