如何将焦点设置为NSButton?

时间:2015-08-06 22:54:58

标签: xcode macos swift nsbutton

我正在为OS X Yosemite编写一个小型菜单栏应用程序。单击菜单栏图标时,会出现一个带有多个凹陷按钮的弹出窗口。像这样:enter image description here

如您所见,即使默认情况下选择了d20,“d4”按钮也会被聚焦。单击任何其他按钮不会更改“d4”按钮的焦点。移动聚焦环的唯一方法是通过Tab键。

以下是来自popover视图控制器的代码:

import Cocoa

class DiceRollerViewController: NSViewController {

    var result: Int = 0

    var currentNumberOfSides = 20

    @IBOutlet weak var rollButton: NSButton!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func sidesButtonSelected(sender: NSButton?) {
        for view in self.view.subviews as [NSView] {
            if let btn = view as? NSButton {
                if btn.tag == 1 {
                    if btn != sender {
                        btn.state = 0
                    }
                    else {
                        btn.state = 1
                    }
                }
            }
        }
    }

    @IBAction func rollDice(sender: AnyObject?) {
        willChangeValueForKey("result")
        result = DiceRoller.rollDice(numberOfRolls: 1, numberOfSides: 20)
        didChangeValueForKey("result")
    }

}

相关的AppDelegate代码:

func showPopover(sender: AnyObject?) {
        if let button = statusItem.button {
            popover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: NSRectEdge.MinY)
        }
    }

总结一下,我正试图摆脱单击弹出窗口时自动出现的对焦环。但是,出于可访问性原因,我不想删除通过选项卡进行聚焦的功能。

谢谢!

1 个答案:

答案 0 :(得分:9)

尝试覆盖viewWillAppear()以制作“滚动!”按下第一个响应者:

if theRollButton.acceptsFirstResponder {
    self.view.window.makeFirstResponder(theRollButton)
}