我的应用程序中有一个NSTokenField
我实现了tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:
方法,我用setTokenizingCharacterSet:
方法指定了接收者的标记字符集:
def tokenField(tokenField, completionsForSubstring:substring, indexOfToken:tokenIndex, indexOfSelectedItem:selectedIndex)
tokenField.setTokenizingCharacterSet(NSCharacterSet.whitespaceAndNewlineCharacterSet)
end
当我点击空格键或输入按钮时,它按预期工作。当我用鼠标点击完成列表中的一个项目时,我也希望有相同的行为。
这怎么可能?
感谢您的帮助。
答案 0 :(得分:3)
我不知道是否可以在NSTokenField中使用此行为。
但是你应该看看MTTokenField哪些能做你想要的开箱即用。
为此,您必须:
1.将Xcode项目创建为静态库(不要启用ARC)。
2.将您的项目保存到vendor / MTTokenField
3.将位于子目录“MTTokenField”中的MTTokenField的所有文件拖放到新的XCode项目中。选择复制文件。
4.将此添加到您的rakefile中,以便使用您的Rubymotion项目编译和链接库。
app.vendor_project("vendor/MTTokenField/", :xcode, :xcodeproj => "MTTokenField.xcodeproj", :target => "MTTokenField", :products => ["libMTTokenField.a"], :headers_dir => "MTTokenField")
5.在Interface Builder中,将NSTokenField的类更改为NSTextField,然后将其自定义类设置为MTTokenField,并更改单元的自定义类:MTTokenFieldCell而不是NSTextFieldCell。
6.然后,您必须将MTTokenField的委托设置为必须响应的类:
def tokenField(tokenField, completionsForSubstring: substring )
# your have to return an array containing your results matching substring.
end
就是这样。它应该工作。
希望它有所帮助!
答案 1 :(得分:2)
我找到了使用NSTokenField
而不是MTTokenField
的其他解决方案。
在我的NSTokenField的委托中,我使用了NSControl的controlTextDidChange方法,该方法在我在令牌字段中编写字符时随时调用。在这个方法中,我检查是否有一个触发的NSLeftMouseUp事件,如果是这种情况,我模拟一个点击返回。就是这样。
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:method:
selectedIndex[0] = -1