单击某个项目时关闭NSTokenField完成列表?

时间:2013-02-13 04:24:08

标签: objective-c macos cocoa nstokenfield

我的应用中有一个NSTokenField。当我点击完成列表中的一个建议时,我希望列表消失并完成令牌(如Mail)但是,这似乎没有发生 - 点击建议只是附加剩余的字符串和列表不会消失。

如果按下Return键,完成列表就会消失,但我希望通过点击建议来解除它。我怎样才能做到这一点?

2 个答案:

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