Cocoa 获取NSTextField完成的索引

Cocoa 获取NSTextField完成的索引,cocoa,nstextfield,nstextview,Cocoa,Nstextfield,Nstextview,我有一个NSTextField UI元素,用户可以在其中键入文本字段,我想在文本字段下下拉一个完成列表作为“实时搜索” 我希望使用原生文本补全基础设施,但当用户选择适当的补全时,我不想只将文本放入NSTEXT字段。用户实际上是通过搜索对象的字符串属性来选择NSArray中许多自定义对象中的一个。当他们选择时,我需要知道他们选择了哪个对象 是否有方法知道所选完成的索引(以便我可以从数组中的该索引中获取对象) 或者我需要忘记使用本机文本补全,而只是在文本字段下填充并显示一个下拉列表吗?在这种情况下,

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

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

是否有方法知道所选完成的索引(以便我可以从数组中的该索引中获取对象)

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

在这种情况下,您可以使用吗?可能还有子类nscomboxcell来覆盖

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

您还可以观察中的更改,以检测所选项目的更改

最后,由于NSTokenField为我添加了一些UI外观,我使用了一个NSTokenField。但我认为我想出的额外技巧(如下)可能也适用于NSTextField。对不起,这有点复杂

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

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


我认为在
controlTextDidChange:
NSTextFieldDelegate方法中可能存在一些争论,可以使用字典技巧对NSTextField而不是NSTokenField上的补全执行相同的操作,但为了做到这一点,我认为您必须在NSTextField中完成完整的补全,获取其stringValue,然后将其用作键。在我的例子中,我不希望在文本字段中完成全部操作,因此NSTokenField的标记化对我来说更有效。

这是一个好主意,但我不想要向下箭头,我正在对文本字段进行一些可视化处理,我不知道是否可以使用组合框进行复制。你知道当下拉菜单不显示时,是否有办法抑制向下箭头的显示,使NSComboBox看起来像纯文本字段吗?我不知道。也许你可以忽略drawRect:无论如何,谢谢你的想法。我在想,要获得我真正想要的外观,我可能必须在文本字段的底部动态粘贴一列NSTableView。看起来有点困难,但到目前为止,我想不出另一种方法。如果完成触发了一个通知,或者告诉NSTextFieldDelegate在发生时选择了哪个完成,那就太好了。