OS X,为什么注册帮助手册后 NSMenu 中的 Help NSMenuItem 被禁用?

问题描述 投票:0回答:1

OS X,为什么注册帮助手册后 mainMenu 中的 Help 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 &quot;Browse All&quot; 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/ 文件夹中。 该捆绑包的结构如下:

    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,下面代码中返回的错误为零。

    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>"
)

我观察到上面的菜单帮助只有一项。

无论帮助菜单是否存在,标题为“HungryMe Help”的帮助菜单项都会显示为灰色 在 NIB 中启用。

osx-lion nsmenuitem
1个回答
1
投票

我从 NIB 文件中删除了帮助菜单项,然后在 Xcode 中重新添加了它。然后,由于我不明白的原因,帮助菜单被启用。以下代码使帮助查看器出现:

    - (IBAction) showHelp:(id)sender {
        int status =  MyGotoHelpPage();
        DLog(@"status for HelpBook load is %d",status);
    }
    
    OSStatus MyGotoHelpPage (void)
    {
        CFBundleRef myApplicationBundle = NULL;
        CFStringRef myBookName = NULL;
        OSStatus err = noErr;
        
        myApplicationBundle = CFBundleGetMainBundle();// 1
        //if (myApplicationBundle == NULL) {err = fnfErr; goto bail;}// 2
        myBookName = CFBundleGetValueForInfoDictionaryKey( myApplicationBundle,                                                                            CFSTR("CFBundleHelpBookName"));                                                                    
        if (myBookName == NULL) {err = fnfErr; return err;}
        
        if (CFGetTypeID(myBookName) != CFStringGetTypeID()) {// 4
            err = paramErr;
        } 
        
        err = AHGotoPage (myBookName, NULL,NULL);// load title page
        return err;
    }

帮助查看器将显示一条消息:“所选主题当前不可用。” 这是进步。

© www.soinside.com 2019 - 2024. All rights reserved.