`NSStatusItem`, созданный из` main () `, не отображается в строке состояния системы - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать простое приложение MacOS Cocoa, используя NSStatusItem, чтобы создать кликабельный значок в строке состояния системы. Однако, когда я запускаю свое приложение, я получаю это предупреждение, и значок не появляется:

2020-03-03 14:43:11.564 Mocha_bug_example[936:39572] CGSGetActiveMenuBarDrawingStyle((CGSConnectionID)[NSApp contextID], &sCachedMenuBarDrawingStyle) returned error 268435459 on line 46 in NSStatusBarMenuBarDrawingStyle _NSStatusBarGetCachedMenuBarDrawingStyle(void)

Вот минимальный воспроизводимый пример для моего приложения:

#import <AppKit/AppKit.h>

NSStatusItem* statusItem;

int main (int argc, char* argv[]) {
        statusItem = [NSStatusBar.systemStatusBar statusItemWithLength: -1];
        statusItem.button.title = @"foobar";
        statusItem.visible = YES;

        [NSApplication.sharedApplication run];
        return 0;
}

Я скомпилировал и запустил пример следующим образом:

MacBook-Air-5:Mocha ericreed$ clang -o Mocha_bug_example -framework AppKit -fobjc-arc Mocha_bug_example.m
MacBook-Air-5:Mocha ericreed$ ./Mocha_bug_example
2020-03-03 14:43:11.564 Mocha_bug_example[936:39572] CGSGetActiveMenuBarDrawingStyle((CGSConnectionID)[NSApp contextID], &sCachedMenuBarDrawingStyle) returned error 268435459 on line 46 in NSStatusBarMenuBarDrawingStyle _NSStatusBarGetCachedMenuBarDrawingStyle(void)
[Application hung until I pressed Ctrl+C]
^C
MacBook-Air-5:Mocha ericreed$ 

Примечание: отключение автоматического c подсчета ссылок и добавление [statusItem release]; после вызова run как предложенный аналогичный вопрос не сделал видимой разницы .

Ответы [ 3 ]

2 голосов
/ 15 марта 2020
#import <Cocoa/Cocoa.h>

int main(){
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
 NSApplication *application = [NSApplication sharedApplication];
 NSStatusItem* statusItem;
 statusItem = [NSStatusBar.systemStatusBar statusItemWithLength: -1];
 statusItem.button.title = @"foobar";
 statusItem.visible = YES;
 [application run];
 [pool drain];
 return 0;
}

Сохранить файл с именем 'statusBar_SO.m'

Компилировать из терминала: clang statusBar_SO.m -framework Cocoa -o statusBar && ./statusBar

1 голос
/ 28 апреля 2020

Как добавить элемент строки состояния в приложение командной строки ma c osx cocoa

Адаптация ответа apodidae к Swift. Просто поместите это в файл main.swift:

let app = NSApplication()
let statusItem = NSStatusBar.system.statusItem(withLength: -1)
statusItem.button!.title = "PENIS!"
app.run()

Я не понимаю более тонкие детали NSReleasePool, включая apodidae, но у меня это работает без этого.

1 голос
/ 04 марта 2020

Это не та вещь, которую вы можете сделать в main().

За исключением экстремально необычных ситуаций, вы никогда не должны изменять main(), который поставляется с шаблоном приложения. , и он должен вызвать NSApplicationMain():

int main(int argc, char *argv[])
{
    // start the application
    return NSApplicationMain(argc, (const char **) argv);
}

Платформа Cocoa не инициализируется до тех пор, пока вы не вызовете NSApplicationMain(), и, как правило, до тех пор не используется.

Этот тип настройки должен быть сделано в applicationWillFinishLaunching или applicationDidFinishLaunching.

Обновление

Оригинальный плакат не с использованием Xcode и готов выдержать дикую местность один. ;)

Это также означает, что в их комплекте приложений не будет основного файла NIB, который обычно создает и подключает объект делегата приложения, главное меню и т. Д.

Есть бесстрашные индивидуумы кто освоил эту территорию, и вы можете прочитать об этом в Создание приложения Какао без файлов NIB .

...