【问题标题】:Setting a custom tab order in a Cocoa application在 Cocoa 应用程序中设置自定义 Tab 键顺序
【发布时间】:2012-09-21 04:38:46
【问题描述】:

我有一个包含两列字段的窗口。左边有一个NSTableView和一个NSTokenField,右边有两个NSTextFields。我希望标签顺序从左边向下,然后向右向下。 (所以在我的窗口中顺序应该是NSTableViewNSTokenFieldNSTextFieldNSTextField。)但是,Cocoa 似乎正在确定自己的首选顺序,从上到下。 NSTokenField 在窗口中的位置比任何其他控件都低,因此它总是从NSTableView 到右侧NSTextFields,然后回到左下角NSTokenField

我已尝试遵循 Apple 开发人员文档中名为 Enable Tabbing Between Text Fields 的这一部分,并按照我想要的顺序在字段之间拖动 Interface Builder 中的 nextKeyView。这似乎对 tab 顺序的影响绝对为零,据我所知,Cocoa 似乎仍然使用其默认检测方法来选择 tab 顺序。

有什么想法吗?我的目标是 10.6+。

【问题讨论】:

    标签: cocoa interface-builder tabbing


    【解决方案1】:

    确保您还将窗口的initialFirstResponder 出口设置为第一个字段(在本例中为表格视图)。

    【讨论】:

    • 谢谢...这就是问题所在。不过我确实觉得有点傻。 :)
    【解决方案2】:

    听起来您将不得不以编程方式执行此操作:
    注册controlTextDidEndEditing通知,通过标签识别字段,然后在窗口调用makeFirstResponder:fieldOfYourChoice。和/或在现场使用IBAction,通过sender 识别它,然后致电makeFirstResponder

    【讨论】:

    • 为什么我必须以编程方式进行?如果用户想要 shift+tab 怎么办?对于它的价值,我确实尝试过这个,但它没有用。一个问题是当您离开它时,NSTableView 不会向其委托发送 controlTextDidEndEditing 通知。即使在触发通知的 NSTokenField 和 NSTextFields 上,makeFirstResponder 消息似乎也没有改变标签顺序。最后,我不确定在字段上使用 IBAction 是否适合我,因为我认为按下回车键时会触发,并且我不想在按下回车键时更改字段。
    • 如果没有其他方法,您可以尝试捕获关键事件。你所有的控件都是 NSResponder 的子类,所以如果你子类化它们,你可以自定义 NSResponder 的 keyUp 方法。测试事件是选项卡还是移位选项卡。如果没有,什么也不做。如果是这样,请从窗口中找出哪个控件具有 firstResponder 状态,以便您知道自己在哪里,然后从那里开始。 (为此,您必须能够使用 makeFirstResponder。它适用于按钮和文本字段。也许尝试添加 0.1 延迟?)此外,您可能需要删除 IB 中冲突的 nextKeyViews。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多