【问题标题】:NSTextfield + NSMenu and first responderNSTextfield + NSMenu 和第一响应者
【发布时间】:2011-08-29 13:18:37
【问题描述】:

我正在尝试实现我自己的自动补全系统(结果是从 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 是我的NSTextFieldmenu 是我的NSMenu。 问题是菜单占据了焦点,因此您只能在文本字段中输入 1 个字母,然后您不能再输入文本,因为菜单现在是第一响应者。

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

实际上应该像在 Safari 或 chrome 地址栏中一样。

【问题讨论】:

    标签: objective-c cocoa autocomplete nstextfield nsmenu


    【解决方案1】:

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

    【讨论】:

    • 我已经丢弃了 NSMenu 并使用 TableView 视图。问题是,如果我将 firstResponder 提供给 TableView,我将无法在文本字段中输入更多字符。解决方案是仅将向上和向下箭头键转发到 TableView 并执行适当的操作。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多