Objective c NSSearchField结果菜单

Objective c NSSearchField结果菜单,objective-c,macos,cocoa,nssearchfield,Objective C,Macos,Cocoa,Nssearchfield,我已经搜索了好几个小时,仍然没有找到答案。如何获取NSSearchField以显示包含结果的菜单。我可以使用“最近的搜索”菜单显示结果,但如何以编程方式显示菜单?谢谢你的帮助。我相信苹果是通过一些私人方法做到这一点的。可能它使用的是NSWindow而不是NSMenu。一种方法是在NSSearchField代理中实现这一点,假设您有一个指向NSSearchField的IBOutlet - (void)controlTextDidEndEditing: (NSNotification *)aNoti

我已经搜索了好几个小时,仍然没有找到答案。如何获取
NSSearchField
以显示包含结果的菜单。我可以使用“最近的搜索”菜单显示结果,但如何以编程方式显示菜单?谢谢你的帮助。

我相信苹果是通过一些私人方法做到这一点的。可能它使用的是
NSWindow
而不是
NSMenu
。一种方法是在
NSSearchField
代理中实现这一点,假设您有一个指向
NSSearchField
IBOutlet

- (void)controlTextDidEndEditing: (NSNotification *)aNotification
{
    NSString *searchString = [searchField stringValue];

    NSMenu *menu = [[NSMenu alloc] initWithTitle: @"results"];

    [menu addItemWithTitle: searchString action: @selector(someAction:) keyEquivalent: @""];
    [menu addItemWithTitle: @"someString" action: @selector(someOtherAction:) keyEquivalent: @""];

    NSEvent *event =  [NSEvent otherEventWithType: NSApplicationDefined
                                         location: [searchField frame].origin
                                    modifierFlags: 0
                                        timestamp: 0
                                     windowNumber: [[searchField window] windowNumber]
                                          context: [[searchField window] graphicsContext]
                                          subtype: NSApplicationDefined
                                            data1: 0
                                            data2: 0];

    [NSMenu popUpContextMenu: [menu autorelease] withEvent: event forView: searchField];
}

请注意,显示菜单可防止在
NSSearchField
中进一步键入内容。这就是为什么我使用了
controltextdidediting:
而不是
controlTextDidChange:
。您还应该检查活动的更多定制。

苹果的代码与您需要的类似。示例代码使用NSTextField(NSSearchField的父类)。希望这能解决您的问题。

谢谢,效果很好。唯一的变化是,我在事件中修改了location参数,将菜单向下移动了大约5,这样它就不会与搜索字段重叠。谢谢我还没有对此进行测试,但也许您可以将整个NSEvent更改为
[NSEvent currentEvent]
。也许然后它会得到默认的位置等等。