Проблемы OSX / Cocoa при создании элемента строки состояния (руководство Apple не работает для меня)

Я считаю, что правильно следую примеру. (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/StatusBar/Tasks/creatingitems.html)

@interface AppDelegate : NSObject <NSApplicationDelegate> {
NSStatusItem *testItem;
NSMenu *testMenu;
}

...

@implementation AppDelegate


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    testMenu = [[NSMenu alloc] init];
    [testMenu addItemWithTitle:@"An Item" action:nil keyEquivalent:nil];
    [testMenu addItemWithTitle:@"Another Item" action:nil keyEquivalent:nil];

    NSStatusBar *bar = [NSStatusBar systemStatusBar];

    testItem = [[NSStatusItem alloc] init];
    testItem = [bar statusItemWithLength:NSVariableStatusItemLength];
    [testItem setTitle: @"X"];
    [testItem setHighlightMode:YES];
    [testItem setMenu:testMenu];
    [testItem setEnabled:YES];
}

Строю и бегаю. Новых элементов строки состояния не видно. Почему нет? Простите меня, если я невежественный новичок. Полагаю, я упускаю из виду нечто фундаментальное.


person Oliver    schedule 17.03.2013    source источник
comment
Возможно, ваша строка состояния заполнена и NSStatusBar не может найти место для вашего пункта меню. Проверьте, не является ли оно нулевым, как обычно, если не может найти для него места.   -  person CodaFi    schedule 18.03.2013


Ответы (2)


keyEquivalent для addItemWithTitle не может быть нулевым. Когда вы это делаете, возникает исключение, поэтому оно никогда не проходит мимо этих строк. Измените эти две строки примерно так:

[testMenu addItemWithTitle:@"An Item" action:nil keyEquivalent:@"a"];
[testMenu addItemWithTitle:@"Another Item" action:nil keyEquivalent:@"i"];

И теперь все работает нормально. Вы можете устранить подобные проблемы, посмотрев на вывод отладчика. В этом случае вывод, который дал правильные подсказки, был «Недопустимый параметр, не удовлетворяющий: charCode! = Nil».

Вы можете получить больше от _ 4_ документация:

Строка, определяющая ключ для использования в качестве эквивалента ключа для пункта меню. Если вы не хотите, чтобы у пункта меню был ключевой эквивалент, keyEquiv должен быть пустой строкой (@ ""), а не nil.

person vcsjones    schedule 17.03.2013
comment
Правда что! Кроме того, если вы не хотите иметь keyEquivalent, просто укажите пустую строку @, а если вы хотите, чтобы Command-A использовала @a (а не @A). - person ; 18.03.2013

Я знал, что это что-то фундаментальное. Я должен был проверить это в первую очередь. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification не звонили. Исправлено сейчас.

person Oliver    schedule 17.03.2013