Конфигурирование поискового меню

Поле поиска имеет меню, к которому пользователи могут получить доступ путем щелчка по небольшому треугольнику рядом с кнопкой поиска. Элементы в этом раскрываются, меню значка имеют две цели: перечислять недавно введенные строки поиска и перечислять поисковые категории для ограничения объема поиска. Когда поле поиска отправляет свое сообщение действия, можно также указать.

Генерация сообщений действия

Поле поиска имеет два режима для генерации сообщений действия:

Обычно Вы устанавливаете режим в xib файле (см. Добавление Поля поиска к Вашему Приложению). Для установки режима генерации сообщения программно отправить setSendsWholeSearchString: к ячейке поля поиска с параметром NO для инкрементных поисков и YES для регулярных поисков.

Конфигурирование шаблона меню

При указании меню кнопка поиска выводит на экран индикатор меню, и поисковое меню раскрывается, когда пользователь щелкает по кнопке поиска. Не изменяйте меню, в то время как оно используется полем поиска (потому что поле поиска не делает копию меню).

Для конфигурирования всплывающего меню создайте шаблон меню (который является NSMenu объект), и заполняют шаблон меню с элементами (NSMenuItem объекты), Вы хотите появиться. Можно добавить предопределенные элементы к меню путем создания пункта меню и установки его тега в одно из следующих значений (описанный в разделе Constants NSSearchFieldCell ссылка):

Можно указать шаблон меню, используемый при генерации всплывающего меню в поле поиска. Это легко сделано с XCode, или, если Вы программно создали шаблон меню, вызвать setSearchMenuTemplate: устанавливать его в поле поиска.

Можно также сделать все это программно. Перечисление 1 иллюстрирует, как Вы могли бы установить поисковый шаблон меню.

Перечисление 1  , Устанавливающее меню, обрабатывает по шаблону для недавних строк поиска

- (void) awakeFromNib
{
    NSMenu *cellMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"Search Menu", @"Search Menu title")];
    NSMenuItem *item;
 
    item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Clear", @"Clear menu title")
                               action:NULL keyEquivalent:@""];
    [item setTag:NSSearchFieldClearRecentsMenuItemTag];
    [cellMenu insertItem:item atIndex:0];
 
    item = [NSMenuItem separatorItem];
    [item setTag:NSSearchFieldRecentsTitleMenuItemTag];
    [cellMenu insertItem:item atIndex:1];
 
    item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Recent Searches", @"Recent Searches menu title")
                               action:NULL keyEquivalent:@""];
    [item setTag:NSSearchFieldRecentsTitleMenuItemTag];
    [cellMenu insertItem:item atIndex:2];
 
    item = [[NSMenuItem alloc] initWithTitle:@"Recents"
                                action:NULL keyEquivalent:@""];
    [item setTag:NSSearchFieldRecentsMenuItemTag];
    [cellMenu insertItem:item atIndex:3];
 
    id searchCell = [searchField cell];
    [searchCell setSearchMenuTemplate:cellMenu];
}

Меню связано с Вашим полем поиска, только если Вы указываете один в xib файле. Если Вы создаете поле поиска программно и не хотите меню, устанавливаете шаблон меню в nil.

Указание поисковой категории

Для установки поисковой категории Вы создаете пункт меню с заголовком и селектором действия и добавляете его к шаблону меню. Селектор действия идентифицирует метод, вызывающийся с помощью целевого действия, когда пользователь выбирает элемент; в этом методе можно установить флаг или другое значение так, чтобы поисковая реализация знала, как ограничить объем ее поиска. Обычно Вы добавили бы пункт меню к шаблону меню в xib файле. Можно также сделать это программно, как проиллюстрировано в Перечислении 2. Это полезно, если Вы создаете или обновляете меню динамично, например если категории зависят от того, какие столбцы таблицы видимы в табличном представлении.

Перечисление 2  , Устанавливающее меню, обрабатывает по шаблону с поисковой категорией

- (void) awakeFromNib
{
    NSMenu *cellMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"Search Menu", @"Search Menu title")];
    NSMenuItem *item;
 
    item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"First Name", @"First Name menu title")
                               action:@selector(setSearchCategoryFrom:) keyEquivalent:@""];
    [item setTarget:self];
    [item setTag:1];
    [cellMenu insertItem:item atIndex:0];
 
    item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Last Name", @"Last Name menu title")
                               action:@selector(setSearchCategoryFrom:) keyEquivalent:@""];
    [item setTarget:self];
    [item setTag:2];
    [cellMenu insertItem:item atIndex:1];
 
    id searchCell = [searchField cell];
    [searchCell setSearchMenuTemplate:cellMenu];
}

Теги являются дополнительными для поисковых категорий, но они позволяют Вам легко различать между пунктами меню в методе действия. Если Вы принимаете решение указать теги, их значения не должны совпадать ни с одним из значений NSSearchFieldRecentsTitleMenuItemTag, NSSearchFieldRecentsMenuItemTag, NSSearchFieldClearRecentsMenuItemTag, или NSSearchFieldNoRecentsMenuItemTag.

Также необходимо реализовать метод действия, вызванный пунктом меню — посмотрите, что Поиск Использует Поисковую Категорию.