0

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

上記の menuHelp には項目が 1 つしかないことがわかりました。

NIB でヘルプ メニューが有効になっているかどうかに関係なく、「HungryMe Help」というタイトルのヘルプ メニュー項目がグレー表示されます。

4

1 に答える 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; エラーを返します;}

        if (CFGetTypeID(myBookName) != CFStringGetTypeID()) {// 4
            err = paramErr;
        } 

        err = AHGotoPage (myBookName, NULL,NULL);// load title page
        return err;
    }

ヘルプ ビューアが表示され、「選択したトピックは現在利用できません。」というメッセージが表示されます。これは進歩です。

于 2012-11-17T15:44:01.450 に答える