Xcode 如何将焦点设置为NSB按钮?

Xcode 如何将焦点设置为NSB按钮?,xcode,macos,swift,nsbutton,Xcode,Macos,Swift,Nsbutton,我正在为OS X Yosemite编写一个小菜单栏应用程序。单击菜单栏图标时,会出现一个弹出窗口,其中有许多嵌入式按钮。像这样: 如您所见,“d4”按钮是聚焦的,即使默认情况下选择了d20。单击任何其他按钮不会改变“d4”按钮的焦点。移动聚焦环的唯一方法是通过Tab键 以下是我在popover视图控制器中的代码: import Cocoa class DiceRollerViewController: NSViewController { var result: Int = 0

我正在为OS X Yosemite编写一个小菜单栏应用程序。单击菜单栏图标时,会出现一个弹出窗口,其中有许多嵌入式按钮。像这样:

如您所见,“d4”按钮是聚焦的,即使默认情况下选择了d20。单击任何其他按钮不会改变“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)
        }
    }

总而言之,我正试图摆脱点击popover时自动出现的聚焦环。但是,出于可访问性的原因,我不想取消通过选项卡聚焦的功能。

尝试覆盖
viewwillappease()
通过执行以下操作使“滚动!”按钮成为第一响应者:

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

不幸的是,这失败了,因为滚动按钮在弹出框中,而不是窗口中。当我打开
window
时,程序崩溃,因为
window
为零。我敢肯定引擎盖下面一定有一扇窗户。例如,窗口是管理第一响应者(焦点)的窗口。太多的代码将依赖于有一个窗口,让事情在没有窗口的情况下工作。也许可以试试
viewdideappease()
。啊,太好了。作为记录,我误读了您的原始答案,因此我将if语句放在
viewDidLoad()
中。哎呀!事实上,两者都有效。非常感谢。:)