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

Mat*_*off 5 macos cocoa objective-c nstokenfield

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

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

sie*_*ied 4

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

我正在使用 ruby​​motion,即使我可以翻译Objective-CRuby,我也无法做相反的事情,所以我的答案将是Ruby。请随意编辑我的答案以添加相应的Objective-C代码。

在 my 的委托中NSTokenField,我使用了controlTextDidChange方法NSControl,只要我在令牌字段中写入字符,就会调用该方法。在这个方法中,我检查是否有一个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
Run Code Online (Sandbox Code Playgroud)

但就像我告诉你的那样,它还不完美:我的问题是,如果我有一个包含 3 个项目的完成列表,则默认情况下会选择其中一个,比如说第一个。在这种情况下,如果我单击第二个或第三个项目,我的解决方案将按预期工作,但我必须双击第一个项目才能使其工作。

但这仍然是一个好的开始,我希望它能有所帮助!

编辑

为了解决我遇到的最后一个问题,我关闭了自动完成功能并仅显示建议框。为此,我将这一行添加到该tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:方法中:

selectedIndex[0] = -1
Run Code Online (Sandbox Code Playgroud)