Меню результатов NSSearchField

Я искал часы и до сих пор не нашел ответа на этот вопрос. Как заставить NSSearchField отображать меню с результатами. Я могу использовать меню недавних поисков для отображения результатов, но как заставить меню отображаться программно? Спасибо за любую помощь.


person edc1591    schedule 11.11.2011    source источник


Ответы (2)


Я считаю, что Apple делает это с помощью некоторых частных методов. Возможно, он использует NSWindow вместо NSMenu. Один из способов сделать это — реализовать это в делегате NSSearchField, предполагая, что у вас есть IBOutlet, указывающий на 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];
}

Обратите внимание, что отображение меню предотвращает дальнейший ввод NSSearchField. Вот почему я использовал controlTextDidEndEditing:, а не controlTextDidChange:. Вам также следует проверить класс NSEvent. Ссылка для дополнительной настройки мероприятия.

person Jef    schedule 11.11.2011
comment
Спасибо, работает отлично. Единственное изменение заключалось в том, что я изменил параметр местоположения в событии, чтобы сместить меню вниз примерно на 5, чтобы оно не перекрывало поле поиска. Спасибо! - person edc1591; 13.11.2011
comment
Я не проверял это, но, возможно, вы могли бы изменить всю вещь NSEvent на [NSEvent currentEvent]. Возможно, тогда он получит местоположение по умолчанию и т. Д. - person Jef; 13.11.2011

У Apple есть пример кода, похожего на то, что вам нужно. В примере кода используется NSTextField (который является родительским классом NSSearchField). Надеюсь, это решит вашу проблему.

person billibala    schedule 11.02.2015