OS X,为什么在注册帮助手册后 mainMenu 中的帮助 NSMenuItem 被禁用
标签:OSX, HelpBook, NSMenuItem, AHRegisterHelpBookWithURL
帮助手册无法使用,因为帮助菜单已禁用。选择帮助菜单时,帮助子菜单显示如下:
Spotlight Search searchBar here - BLUE
HungryMe Help - GREYED OUT
MainWindow.nib 包含菜单。帮助菜单项在 Xcode 中启用。
帮助手册
HelpBook Info.plist 如下;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en_US</string>
<key>CFBundleIdentifier</key>
<string>com.DrummingGrouse.HungryMe.help</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>HungryMe</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>hbwr</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>HPDBookAccessPath</key>
<string></string>
<key>HPDBookIconPath</key>
<string>shrd/EyeOnly.png</string>
<key>HPDBookIndexPath</key>
<string></string>
<key>HPDBookKBProduct</key>
<string></string>
<key>HPDBookKBURL</key>
<string></string>
<key>HPDBookRemoteURL</key>
<string></string>
<key>HPDBookTitle</key>
<string>HungryMe Help</string>
<key>HPDBookType</key>
<string>3</string>
</dict>
</plist>
测试标题页 HungryMe.html 如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" AppleTitle="com.DrummingGrouse.HungryMe.help" />
<title>HungryMe</title>
</head>
<body>
<a name="hungryme_page"></a>
<div class="container">
<p>This is some text. <img src="../shrd/EyeOnly.png" align="middle"> This is some more text.</p>
<div class="content">
<h1>Getting Started - Cooking with HungryMe</h1>
<p>HungryMe has a main window with Category elements on the left and Recipe elements on the right.</p>
<p>The display of a recipe's details is done as follows:</p>
<p> 1. Select a recipe Category in the left table of the main window. Select "Browse All" if you wish to have all recipes to be listed.</p>
<p>2. Double click the desired recipe and a separate window will appear displaying the details for the selected recipe. Multiple recipes can be displayed simultaneously.</p>
<!-- end .content --></div>
<!-- end .container --></div>
</body>
</html>
该应用程序的 Info.plist 有:
CFBundleHelpBookFolder HungryMe.help CFBundleHelpBookName com.DrummingGrouse.HungryMe.help
Apple 帮助编程指南有:
The CFBundleHelpBookName key identifies the help book. The value associated with this key
should be a string specifying the help book title, as defined by the AppleTitle tag in the
title page of the book. For example, here is how you would enter the title
of the SurfWriter Help book:
<key>CFBundleHelpBookName</key>
<string>com.mycompany.surfwriter.help</string>
帮助手册包 HungryMe.help 被添加到 Xcode 项目的 Resources/ 文件夹中。Bundle 的结构是这样的:
HungryMe.help/
Contents/
Info.plist
Resources/
shrd/ <shared artwork>
English.lproj/
HungryMe.html <title page>
pgs/ <the rest of the content pages>
gfx/ <localized artwork>
sty/ <style sheets, generated list template>
scrpt/ <scripts>
无论帮助手册是否使用 AHRegisterHelpBookWithURL 注册,将显示帮助手册的帮助菜单项都是灰色的。
如果使用 AHRegisterHelpBookWithURL,则下面代码中返回的 err 为零。
OSStatus RegisterMyHelpBook(void)
{
CFBundleRef myApplicationBundle;
CFURLRef myBundleURL;
OSStatus err = noErr;
myApplicationBundle = NULL;
myBundleURL = NULL;
myApplicationBundle = CFBundleGetMainBundle();// 1
if (myApplicationBundle == NULL) {err = fnfErr; return err;}
myBundleURL = CFBundleCopyBundleURL(myApplicationBundle);// 2
if (myBundleURL == NULL) {err = fnfErr; return err;}
if (err == noErr){
err = AHRegisterHelpBookWithURL(myBundleURL);// 3
}
return err;
}
以下代码在启动时执行,
NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
NSMenuItem *menuItemHelp = [mainMenu itemWithTitle:@"Help"];
NSMenu *menuHelp = [menuItemHelp submenu];
NSMenuItem *menuItemHelpHungryMe = [menuHelp itemAtIndex:0];
DLog(@"menuItemHelpHungryMe=%@",menuItemHelpHungryMe);
DLog(@"menuHelp=%@",menuHelp);
产生以下输出。
2012-11-16 11:30:03.167 HungryMe[62153:303] -[AppDelegate applicationDidFinishLaunching:]
menuItemHelpHungryMe=<NSMenuItem: 0x1b6e3c0 HungryMe Help>
2012-11-16 11:30:03.168 HungryMe[62153:303] -[AppDelegate applicationDidFinishLaunching:]
menuHelp=<NSMenu: 0x1b6e3a0>
Title: Help
Supermenu: 0x1b6c8e0 (MainMenu), autoenable: YES
Items: (
"<NSMenuItem: 0x1b6e3c0 HungryMe Help>"
)
我观察到上面的 menuHelp 只有一项。
无论 NIB 中是否启用了帮助菜单,标题为“HungryMe 帮助”的帮助菜单项都是灰色的。