Search code examples
objective-cmacoscocoanssearchfield

NSSearchField results menu


I've been searching for hours and still haven't found an answer to this. How can you get an NSSearchField to display a menu with results. I can use the recent searches menu to display results, but how do I make the menu display programmatically? Thanks for any help.


Solution

  • I believe Apple does this with some private methods. Maybe it uses an NSWindow instead of an NSMenu. One way to do it is to implement this in your NSSearchField delegate assuming you have an IBOutlet pointing to the NSSearchField.

    - (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];
    }
    

    Note that showing a menu prevents further typing in the NSSearchField. That's why I used controlTextDidEndEditing:and not controlTextDidChange:. You should also check NSEvent's Class Reference for more customization of the event.