Удалить (или настроить) «Поиск» из меню справки

В моем приложении есть меню "Справка" по умолчанию. Я удалил запись «Помощь» и добавил запись поддержки, которая ведет на форум на моем веб-сайте.

Ниб меню справки выглядит так:

Меню в наконечнике

Но как только я запустил приложение, появился новый пункт меню:

Меню с поиском

Как убрать поиск? (Или, что еще лучше, как заставить его запускать URL-адрес с такими параметрами, как http://mywebsite.com/support?search=XXXXX).


person Kyle    schedule 27.02.2014    source источник


Ответы (7)


Вы ищете протокол NSUserInterfaceItemSearching. Верните один элемент результатов поиска и используйте его, чтобы открыть свой собственный URL-адрес.

- (void)searchForItemsWithSearchString:(NSString *)searchString resultLimit:(NSInteger)resultLimit matchedItemHandler:(void (^)(NSArray *items))handleMatchedItems
{
    handleMatchedItems(@[searchString]);
}

- (NSArray *)localizedTitlesForItem:(id)item
{
    return @[[NSString stringWithFormat:@"Search for '%@' on my website", [item description]]];
}

- (void)performActionForItem:(id)item
{
    // Open your custom url assuming item is actually searchString
}
person pointum    schedule 01.03.2014
comment
Для тех, кто занимается разработкой для Mac через Mac Catalyst: это не поддерживается в приложениях Mac Catalyst. - person arlomedia; 10.03.2020

Я нашел способ удалить панель поиска (но не настроить ее).

Просто назначьте меню, которое не используется, меню справки:

NSMenu *unusedMenu;
unusedMenu = [[NSMenu alloc] initWithTitle:@"Unused"];

NSApplication *theApp;
theApp = [NSApplication sharedApplication];
theApp.helpMenu = unusedMenu;

В документации это упоминается в свойстве helpMenu класса NSApplication.

person zhoudu    schedule 12.01.2017

Вы, вероятно, не хотите избавляться от этой панели поиска, поскольку вы все еще можете использовать ее для поиска пунктов меню!

Поиск пунктов меню

Я уверен, вы знаете, что это окно поиска будет отображать разделы справки только в том случае, если ваше приложение поставляется с справочной книгой Apple, которую можно создать, следуя документация Apple.

Боюсь, я не знаю, как переопределить поведение панели поиска, но если вы не хотите писать документацию для своего приложения, я думаю, было бы лучше сохранить панель поиска, даже если вы можете это сделать. t искать ваш форум для помощи.

person Ben    schedule 27.02.2014
comment
Это только кратко упоминается в NSApplication как помощь в центре внимания или что-то в этом роде. - person uchuugaka; 28.02.2014
comment
Текущая фраза в документах — Помощь в центре внимания. - person leanne; 28.07.2020

Я удаляю панель поиска из меню справки в разработке для Mac, вводя один пробел после справки, например «помощь». Это выглядит забавно, но работает правильно.

введите здесь описание изображения

person user7345678    schedule 10.04.2019
comment
Мое приложение написано на Java. Итак, этот трюк — единственное решение, которое я могу применить. И это работает. - person dpolivaev; 07.06.2020

Ответ @zhoudu сработал для меня. Я перевел его на Swift 5.0:

let unusedMenu = NSMenu(title: "Unused")
NSApplication.shared.helpMenu = unusedMenu

Поместите это в свой AppDelegate.

person Houman    schedule 26.02.2020

Ответы от @pointum и @zhoudu не поддерживаются в приложениях Mac Catalyst, так что вот вариант для этого.

Согласно этому ответу, поле поиска добавляется macOS. Я искал ключ plist, чтобы отключить его, но ничего не нашел. Затем я начал возиться с методом buildMenuWithBuilder. Мне пришлось изменить свой класс AppDelegate, чтобы он был подклассом UIResponder вместо NSObject, и тогда я мог переопределить этот метод в своем AppDelegate. После того, как это запустилось, потребовалось несколько попыток сделать с ним что-то полезное.

Попытка 1: я попытался удалить первый элемент меню "Справка", который был полем поиска.

- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder {
    [super buildMenuWithBuilder:builder];
    [builder replaceChildrenOfMenuForIdentifier:UIMenuHelp fromChildrenBlock:^(NSArray<UIMenuElement *> *currentChildren) {
        NSMutableArray *newChildren = [NSMutableArray arrayWithArray:currentChildren];
        [newChildren removeObjectAtIndex:0 withSafeChecks:TRUE];
        return newChildren;
    }];
}

Но поле поиска добавляется после запуска этого метода, поэтому этот код удалил только элемент «[имя приложения] Справка», который я хотел сохранить.

Попытка 2: я попытался взять элемент меню "[имя приложения] Справка" из меню по умолчанию, затем добавить его в новое меню и заменить меню справки по умолчанию следующим:

- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder {
    [super buildMenuWithBuilder:builder];
    UIMenuElement *helpItem = [[builder menuForIdentifier:UIMenuHelp].children objectAtIndex:0];
    UIMenu *helpMenu = [UIMenu menuWithTitle:@"Help " children:[NSArray arrayWithObject:helpItem]];
    [builder replaceMenuForIdentifier:UIMenuHelp withMenu:helpMenu];
}

Но macOS не так легко обмануть; он по-прежнему идентифицировал это как меню справки и добавил поле поиска. Даже когда я изменил название меню на «Справка», как показано здесь, я получил тот же результат.

Попытка 3: Наконец, мне пришлось создать новое действие справки, добавить его в новое меню справки и назвать это меню с помощью дополнительного пробела. Только когда я сделал все три вещи, macOS перестала добавлять поле поиска:

- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder {
    [super buildMenuWithBuilder:builder];
    UIAction *helpAction = [UIAction actionWithTitle:@"[app name] Help" image:nil identifier:@"simpleHelp" handler:^(__kindof UIAction *action) {
        // my help code
    }];
    UIMenu *helpMenu = [UIMenu menuWithTitle:@"Help " children:[NSArray arrayWithObject:helpAction]];
    [builder replaceMenuForIdentifier:UIMenuHelp withMenu:helpMenu];
}
person arlomedia    schedule 10.03.2020

Вдохновленный ответом @arlomedia и используя Swift 5.x, Xcode 11.x, я создал расширение для appDelegate который работает в Mac Catalyst и делает обе вещи, которые хотел ОП:

  1. Создайте пользовательское меню справки без пункта Поиск и с пунктом Поддержка.
  2. Укажите пользовательский элемент меню Поддержка на веб-страницу.
import UIKit

extension AppDelegate {
    
    /// selector function to open the desired web page
    @objc func openSupportPage() {
        if let url = URL(string: "https://mywebsite.com/support?search=XXXXX") {
            UIApplication.shared.open(url)
        }
    }
    
    /// buildMenu override to customize the default menu
    override func buildMenu(with builder: UIMenuBuilder) {
        
        // ensure we're working with the main menu; and, if so, run `super`!
        guard builder.system == .main else { return }
        super.buildMenu(with: builder)
        
        // remove the "stock" help menu
        builder.remove(menu: .help)
        
        // create the Support help item; gave it a shortcut key of "s" (Command-S)
        let supportHelpItem = UIKeyCommand(
            title: "Support",
            action: #selector(openSupportPage),
            input: "s",
            modifierFlags: [.command])
        
        // create a custom menu to appear as *Help* menu on menu bar
        let myHelpMenu = UIMenu(
            title: "Help ",                 // note the space after "Help"
            children: [supportHelpItem])    // add the *Support* item to the menu
        
        // insert the *Help* menu at the end of the existing menu bar items
        // (after the Window item) where the Help menu would've appeared
        builder.insertSibling(myHelpMenu, afterMenu: .window)
    }
}
person leanne    schedule 28.07.2020