当选中项目时关闭NSTokenField完成列表?

5
我在我的app中有一个NSTokenField。当我点击建议列表中的某个建议时,我希望该列表消失并完成标记(就像Mail一样)。但是,这似乎并没有发生-点击建议只会附加剩余的字符串,而列表不会消失。
如果我按回车键,则完成列表将消失,但我也希望通过点击建议来关闭它。我该如何实现这个功能?

2
你找到解决问题的方法了吗? - siekfried
2个回答

4

我已经找到了解决这个问题的方法,虽然它还不是完美的,但我希望很快就能解决最后一个问题。

我正在使用RubyMotion,即使我可以将 Objective-C 翻译成 Ruby,但我无法做到相反,所以我的答案将用 Ruby 语言编写。请随意编辑我的答案,添加相应的 Objective-C 代码。

在我的 NSTokenField 委托中,我使用了 NSControlcontrolTextDidChange 方法,每当我在我的令牌字段中输入字符时都会调用该方法。在此方法中,我检查是否有触发的 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

尝试将Objective-C代码添加到您的答案中,但我的编辑被拒绝了... =( - rocky
如果([[NSApplication sharedApplication]currentEvent].type == NSLeftMouseUp) { CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(nil, 0x24, true)); } - Kappe

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;
...
...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接