我的应用程序中有一个 NSTokenField 。当我单击完成列表中的一个建议时,我希望列表消失并完成令牌(如邮件)但是,这似乎没有发生——单击一个建议只是附加了其余的字符串并且列表不会消失。
如果我按下 Return 键,完成列表就会消失,但我也希望通过单击建议来消除它。我怎样才能做到这一点?
我的应用程序中有一个 NSTokenField 。当我单击完成列表中的一个建议时,我希望列表消失并完成令牌(如邮件)但是,这似乎没有发生——单击一个建议只是附加了其余的字符串并且列表不会消失。
如果我按下 Return 键,完成列表就会消失,但我也希望通过单击建议来消除它。我怎样才能做到这一点?
我找到了解决这个问题的方法,虽然还不完美,但我希望我能尽快解决我遇到的最后一个问题。
我正在使用 rubymotion,即使我可以翻译Objective-C
,Ruby
我也无法做相反的事情,所以我的答案将是Ruby
。随意编辑我的答案以添加相应的Objective-C
代码。
在我的委托中NSTokenField
,我使用了controlTextDidChange方法,NSControl
只要我在令牌字段中写入字符,就会调用该方法。在这种方法中,我检查是否有一个NSLeftMouseUp
事件被触发,如果是这样,我模拟点击Return
(从另一个SO 问题中学习)。就是这样。
这是我的Ruby
代码:
def controlTextDidChange(aNotification)
application = NSApplication.sharedApplication
event = application.currentEvent
if event.type == NSLeftMouseUp
e1 = CGEventCreateKeyboardEvent(nil, 0x24, true)
CGEventPost(KCGSessionEventTap, e1)
end
end
但就像我告诉你的那样,它还不完美:我的问题是,如果我有一个包含 3 个项目的完成列表,默认情况下会选择其中一个,比如说第一个。在这种情况下,如果我单击第二个或第三个项目,我的解决方案将按预期工作,但我必须双击第一个项目才能使其工作。
但是,这是一个好的开始,我希望它会有所帮助!
编辑
为了解决我遇到的最后一个问题,我关闭了自动完成功能,只显示了建议框。为此,我在tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:
方法中添加了这一行:
selectedIndex[0] = -1
感谢@siekfried!
- (void)controlTextDidChange:(NSNotification *)aNotification;
{
if([[NSApplication sharedApplication]currentEvent].type == NSLeftMouseUp)
{
CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(nil, 0x24, true));
}
}
效果很好;)
为避免第一个元素自动选择,请将其添加到您的委托中:
-(NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex
{
*selectedIndex = -1;
...
...
}