NSTextfield + NSMenu和第一响应者

时间:2011-05-20 10:19:48

标签: objective-c cocoa autocomplete nstextfield nsmenu

我正在尝试实现自己的自动完成系统(结果是从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];

我的address NSTextFieldmenuNSMenu。 问题是菜单采取焦点,因此您只能在文本字段中键入1个字母,然后您不能再键入文本,因为菜单现在是第一个响应者。

我的问题是如何显示菜单并将文本字段保留为第一响应者,以便您可以在字段中的每次文本更改时重新加载菜单时键入该菜单。

例如,它应该像在Safari或chrome地址栏中一样。

2 个答案:

答案 0 :(得分:4)

我不相信NSMenu可以做到这一点。 NSMenu实现由系统控制在相当低的水平,并且它被设计为以键盘为焦点。你需要的是创建自己的视图或窗口,看起来有点像菜单,但不使用NSMenu。例如,请注意,chrome地址栏中的菜单看起来不像标准的NSMenu。您需要创建一个将显示和绘制的视图,并在用户输入时接收要更新的回调或通知,但将采用键盘焦点。 NSView(实际上是NSResponder)上有一些方法可以控制视图是否接受第一响应者状态。

答案 1 :(得分:1)

正如mgorbach所说,NSMenu真的不可能。 我已切换到NSTableView并自定义我的文本字段。文本字段将向上和向下箭头转发到表格视图,并且工作正常!