从帮助菜单中删除(或自定义)“搜索”

时间:2014-02-27 17:08:08

标签: macos cocoa nsmenu

我的应用程序具有默认的“帮助”菜单。我删除了“帮助”条目并添加了一个支持条目,该条目链接到我网站上的论坛。

帮助菜单笔尖如下所示:

Menu in nib

但是,一旦我启动了应用程序,并且运行了一个新的菜单项,就会陷入困境:

Menu with search

如何让搜索消失? (或者甚至更好,我怎样才能使用诸如http://mywebsite.com/support?search=XXXXX之类的参数来启动网址。

7 个答案:

答案 0 :(得分:3)

您正在寻找 NSUserInterfaceItemSearching 协议。 返回单个搜索结果项,并使用它打开自定义网址。

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

答案 1 :(得分:3)

我找到了删除搜索栏的方法(但不是自定义搜索栏)。

只需指定一个未用于帮助菜单的菜单:

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

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

文档在NSApplication类的helpMenu属性中提到了这一点。

答案 2 :(得分:1)

你可能不想摆脱那个搜索栏,因为你仍然可以用它来搜索菜单项!

Searching for Menu Items

我相信您知道,如果您的应用附带Apple帮助手册,此搜索框将仅显示“帮助主题”,可以通过Apple's documentation进行操作。

我担心我不知道如何覆盖搜索栏的行为,但如果您不想为您的应用编写文档,我认为保留搜索栏会更好,即使你无法在论坛上寻求帮助。

答案 3 :(得分:1)

@zhoudu的回答对我有用。我将其翻译成Swift 5.0:

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

将其放入您的AppDelegate

答案 4 :(得分:1)

Mac Catalyst应用程序不支持@pointum和@zhoudu的答案,因此这是一个选项。

根据this answer,搜索字段由macOS添加。我寻找了plist key来禁用它,但是没有找到任何东西。然后,我开始迷惑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;
    }];
}

但是此方法运行后会添加搜索字段,因此此代码仅删除了我想保留的“ [app name] Help”元素。

尝试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并不容易被欺骗;它仍然将其识别为帮助菜单,并添加了搜索字段。即使将菜单名称更改为“ Help”(如此处所示),我也得到相同的结果。

尝试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];
}

答案 5 :(得分:0)

我通过在Mac开发的“帮助”菜单中删除搜索栏,方法是在“帮助”后输入一个空格,例如“ help”。它看起来很有趣,但是可以正常工作。enter image description here

答案 6 :(得分:0)

@arlomedia的回答启发,并使用Swift 5.x,Xcode 11.x,我创建了appDelegate的扩展程序,该扩展程序可在Mac Catalyst中使用,并且完成了OP所需的两项工作:< / p>

  1. 创建一个自定义的“帮助”菜单,该菜单不带 Search 项,而带 Support 项。
  2. 将自定义 Support 菜单项指向网页。
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)
    }
}