OS X, Why is Help NSMenuItem in NSMenu disabled after registering the Help Book?

StackOverflow https://stackoverflow.com/questions/13420825

  •  29-11-2021
  •  | 
  •  

Pergunta

OS X, Why is Help NSMenuItem in mainMenu disabled after registering the Help Book

Tags: OSX, HelpBook, NSMenuItem, AHRegisterHelpBookWithURL

The HelpBook is unusable because the Help menu is disabled. When the Help Menu is selected, the Help sub menu appears this way:

    Spotlight Search searchBar here - BLUE
    HungryMe Help  - GREYED OUT

The MainWindow.nib contains the Menu. The Help Menu Item is enabled in Xcode.

THE HELP BOOK

The HelpBook Info.plist follows;

    <?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>

The test Title Page, HungryMe.html, follows:

    <!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>

The App's Info.plist has:

CFBundleHelpBookFolder HungryMe.help CFBundleHelpBookName com.DrummingGrouse.HungryMe.help

The Apple Help Programming Guide has:

    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>

The Help Book bundle, HungryMe.help, is added to the Xcode project's Resources/ folder. The Bundle is structured this way:

    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>

The Help Menu Item that would display the HelpBook is greyed out whether or not the Help Book is registered using AHRegisterHelpBookWithURL.

If AHRegisterHelpBookWithURL is used, the err returned in code below is Zero.

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

The following code, executed at launch time,

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

Produces the following output.

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

I observed that menuHelp above has only one item.

The Help Menu Item titled "HungryMe Help" is greyed out regardless of whether or not the Help Menu is enabled in the NIB .

Foi útil?

Solução

I deleted the Help Menu Item from the NIB file and then re-added it in Xcode. The Help Menu then became enabled for reasons I don't understand. The following code made the Help Viewer appear:

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

The Help Viewer appears with a message: "The selected topic is currently unavailable." This is progress.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top