objectivec-单击项目时关闭NSTokenField完成列表



我的应用程序中有一个NSTokenField。当我单击完成列表中的一个建议时,我希望列表消失,令牌也会完成(如邮件)。然而,这似乎并没有发生——单击建议只会附加字符串的其余部分,列表不会消失。

如果我按Return,完成列表将失效,但我也希望通过单击建议来取消它。我怎样才能做到这一点?

我找到了这个问题的解决方案,它还不完美,但我希望我能很快解决我的最后一个问题。

我使用的是rubymotion,即使我能在Ruby中翻译Objective-C,我也不能做相反的事情,所以我的答案将在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

但正如我告诉你的,它还不完美:我的问题是,如果我有一个包含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;
...
...
}

相关内容

  • 没有找到相关文章

最新更新