我有一个NSTextField UI元素,用户可以在其中键入文本字段,我想在文本字段下方输入完成列表作为“实时搜索”。
我希望使用本机文本完成基础结构,但是当用户选择适当的完成时,我不想仅仅将文本放入NSTextField。用户实际上是通过搜索对象的字符串属性来选择NSArray中的许多自定义对象之一。当他们选择时,我需要知道他们选择了哪个对象。
有没有办法知道所选择的完成索引(以便我可以从我的数组中的该索引获取对象)?
或者我是否需要忘记使用原生文本完成并只填充并显示文本字段下方的下拉列表?
答案 0 :(得分:0)
在这种情况下你能使用NSComboBox吗?也许子类NSComboBoxCell重写
- (NSString *)completedString:(NSString *)substring
您还可以观察NSComboBox delegate protocol中的更改,以检测所选项目的更改
答案 1 :(得分:0)
最后我使用了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的标记化对我来说效果更好。