0

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

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

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

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

4

2 回答 2

0

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

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

您还可以观察NSComboBox 委托协议中的更改以检测所选项目的更改

于 2012-06-23T19:53:14.550 回答
0

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

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

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

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

于 2012-06-29T22:33:04.883 回答