Dim*_*ian 5 cocoa autocomplete objective-c nsmenu nstextfield
我正在尝试实现自己的自动补全系统(结果是从sqlite数据库中提取的)
我已经设置了NSTextField和适当的委托。每当NSTextField中的文本更改时,它都会调用- (void)controlTextDidChange:(NSNotification *)aNotification方法
它工作正常,在这种方法中,我以编程方式构建菜单,最后使用该代码调用/显示了它:
NSRect frame = [address frame];
NSPoint menuOrigin = [[address superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height-25)
toView:nil];
NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouseDown
location:menuOrigin
modifierFlags:NSLeftMouseDownMask // 0x100
timestamp:0
windowNumber:[[address window] windowNumber]
context:[[address window] graphicsContext]
eventNumber:0
clickCount:1
pressure:1];
[NSMenu popUpContextMenu:menu withEvent:event forView:address];
Run Code Online (Sandbox Code Playgroud)
哪里address是我NSTextField和menu我的NSMenu。问题在于菜单是焦点所在,因此您只能在文本字段中键入1个字母,然后再也不能键入文本,因为菜单现在是第一响应者。
我的问题是如何显示菜单并保持文本字段为第一响应者,以便您可以在字段中每次更改文本时重新加载菜单时键入文本。
实际上,它应该像在Safari或chrome地址栏中。
我不相信 NSMenu 可以做到这一点。NSMenu 的实现是由系统在相当低的级别控制的,它被设计为获取键盘焦点。您需要创建自己的视图或窗口,它看起来有点像菜单,但不使用 NSMenu。例如,请注意 chrome 地址栏中的菜单看起来不像标准 NSMenu。您需要创建一个将显示和绘制的视图,并接收回调或通知以在用户键入时进行更新,但不会获取键盘焦点。NSView(实际上是 NSResponder)上有一些方法可以控制视图是否接受第一响应者状态。