【问题标题】:Get index of NSTextField completion获取 NSTextField 完成的索引
【发布时间】:2012-06-23 18:30:29
【问题描述】:

我有一个 NSTextField UI 元素,用户可以在其中输入文本字段,我想在文本字段下方下拉一个完成列表作为“实时搜索”。

我希望使用本机文本完成基础结构,但是当用户选择适当的完成时,我不想仅仅将文本放入 NSTextField。用户实际上是通过搜索对象的字符串属性来选择 NSArray 中的许多自定义对象之一。当他们选择时,我需要知道他们选择了哪个对象。

有没有办法知道所选完成的索引(以便我可以从数组中的索引中获取对象)?

或者我是否需要忘记使用本机文本完成,而只是在文本字段下填充并显示一个下拉列表?

【问题讨论】:

    标签: cocoa nstextfield nstextview


    【解决方案1】:

    在这种情况下您可以使用NSComboBox 吗?也许是 NSComboBoxCell 的子类来覆盖

    - (NSString *)completedString:(NSString *)substring
    

    您还可以观察NSComboBox delegate protocol 的变化以检测所选项目的变化

    【讨论】:

    • 这是个好主意,但我不想要向下箭头,我正在用文本字段直观地做一些其他事情,我不知道我是否可以用组合框复制。你知道是否有办法在下拉菜单不显示时抑制向下箭头的显示并使 NSComboBox 看起来像纯文本字段?
    • 我没有。也许你可以覆盖 drawRect:
    • 无论如何感谢您的想法。我正在考虑获得我真正想要的外观,我可能不得不在我的文本字段底部动态粘贴一个单列 NSTableView。似乎有点杂乱无章,但到目前为止,我想不出另一种方法来做到这一点。如果完成触发通知或告诉 NSTextFieldDelegate 在发生时选择了哪个完成,那就太好了。
    【解决方案2】:

    最后我使用了 NSTokenField,因为 NSTokenField 为我添加了一些 UI 外观。但我认为我想出的额外技巧(如下)也可能适用于 NSTextField。抱歉,这有点令人费解。

    简而言之,我所做的是生成一个 NSMutableDictionary(一个 iVar),其中键是 NSTokenField 中部分字符串的完整完成,对象是完成字符串表示的自定义对象。换句话说,当我生成自定义完成字符串并将它们放入要从 NSTokenFieldDelegate 方法 tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem: 返回的 NSArray 中时,我同时将这些完成中的每一个和它们表示的对象填充到 NSMutableDictionary 中完成作为键,对象作为值。

    当用户“标记”完成时(通过点击 Return 或 Tab——我修改了标记字符集,这就是标记的全部内容),调用 NSTokenFieldDelegate 方法tokenField:representedObjectForEditingString:。在那里,我可以通过使用 editingString 参数作为键从 NSMutableDictionary 获取我的对象:[dict objectForKey:editingString]

    我认为在controlTextDidChange: NSTextFieldDelegate 方法中进行一些争论可能会使用字典技巧在 NSTextField 而不是 NSTokenField 上完成同样的事情,但为了做到这一点,我认为你会必须在 NSTextField 中完整完成,获取它的 stringValue,然后将其用作键。就我而言,我不希望文本字段中的整个补全,因此 NSTokenField 的标记化对我来说效果更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2010-11-02
      • 2015-02-26
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多