我的应用中有一个NSTokenField。当我点击完成列表中的一个建议时,我希望列表消失并完成令牌(如Mail)但是,这似乎没有发生 - 点击建议只是附加剩余的字符串和列表不会消失。
如果按下Return键,完成列表就会消失,但我希望通过点击建议来解除它。我怎样才能做到这一点?
答案 0 :(得分:4)
我找到了解决这个问题的方法,这个问题还不完善,但我希望我能尽快解决上一期的问题。
我正在使用rubymotion,即使我可以在Objective-C
中翻译Ruby
,我也无法做相反的事情,所以我的答案将在Ruby
。您可以随意编辑我的答案,以添加相应的Objective-C
代码。
在NSTokenField
的委托中,我使用了NSControl
NSLeftMouseUp
方法,只要我在令牌字段中编写字符,就会调用此方法。在此方法中,我会检查是否有触发的Return
事件,如果是这样的话,我会模拟Ruby
上的点击(从其他controlTextDidChange获知) 。就是这样。
这是我的def controlTextDidChange(aNotification)
application = NSApplication.sharedApplication
event = application.currentEvent
if event.type == NSLeftMouseUp
e1 = CGEventCreateKeyboardEvent(nil, 0x24, true)
CGEventPost(KCGSessionEventTap, e1)
end
end
代码:
tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:
但就像我告诉你的那样,它还不完美:我的问题是,如果我有一个包含3个项目的完成列表,默认情况下会选择其中一个,让我们说第一。在这种情况下,如果我单击第二个或第三个项目,我的解决方案将按预期工作,但我必须双击第一个项目才能使其正常工作。
但是,它仍然是一个良好的开端,我希望它会有所帮助!
修改强>
要修复我的上一期,我关闭了自动完成功能,只显示了意见框。为此,我将此行添加到selectedIndex[0] = -1
方法:
{{1}}
答案 1 :(得分:0)
感谢@ 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;
...
...
}