我在我的app中有一个NSTokenField。当我点击建议列表中的某个建议时,我希望该列表消失并完成标记(就像Mail一样)。但是,这似乎并没有发生-点击建议只会附加剩余的字符串,而列表不会消失。
如果我按回车键,则完成列表将消失,但我也希望通过点击建议来关闭它。我该如何实现这个功能?
如果我按回车键,则完成列表将消失,但我也希望通过点击建议来关闭它。我该如何实现这个功能?
我已经找到了解决这个问题的方法,虽然它还不是完美的,但我希望很快就能解决最后一个问题。
我正在使用RubyMotion,即使我可以将 Objective-C
翻译成 Ruby
,但我无法做到相反,所以我的答案将用 Ruby
语言编写。请随意编辑我的答案,添加相应的 Objective-C
代码。
在我的 NSTokenField
委托中,我使用了 NSControl
的 controlTextDidChange 方法,每当我在我的令牌字段中输入字符时都会调用该方法。在此方法中,我检查是否有触发的 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
selectedIndex[0] = -1
- (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;
...
...
}