我的应用程序具有默认的“帮助”菜单。我删除了“帮助”条目并添加了一个支持条目,该条目链接到我网站上的论坛。
帮助菜单笔尖如下所示:
但是,一旦我启动了应用程序,并且运行了一个新的菜单项,就会陷入困境:
如何让搜索消失? (或者甚至更好,我怎样才能使用诸如http://mywebsite.com/support?search=XXXXX之类的参数来启动网址。
答案 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)
你可能不想摆脱那个搜索栏,因为你仍然可以用它来搜索菜单项!
我相信您知道,如果您的应用附带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>
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)
}
}