Какао-приложения из командной строки - PullRequest
1 голос
/ 15 ноября 2011

Я пытался создать приложение Cocoa (для настольных компьютеров) без использования NIB или XIB, следуя инструкциям здесь . Все хорошо, и из Terminal.app я могу успешно запустить приложение. Однако он создается без каких-либо обычных украшений, таких как строка меню или значок дока, за окном терминала и, похоже, очень сильно привязан к процессу терминала.

Я подозревал, что это может быть следствием запуска самого двоичного файла непосредственно из командной строки, но немного поиграв, я обнаружил, что, по крайней мере, Calculator.app более чем рад создать "настоящее" приложение при вызове с использованием

$ /Applications/Calculator.app/Contents/MacOS/Calculator

Чего мне не хватает, если вообще что-то здесь? Я также попытался загрузить файл XIB через

NSNib *mainNib = [[NSNib alloc] initWithContentsOfURL:[[NSURL URLWithString:@"../MainMenu.xib"] absoluteURL]];
[NSNib instantiateNibWithOwner:application topLevelObjects:nil];

, который, кажется, находит XIB, но не имеет значения (т. Е. Графический интерфейс загружен не полностью).

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

После небольшого поворота я нашел решение проблемы. Преобразование типа процесса с помощью TransformProcessType и последующее использование точно названного [NSApp activateIgnoringOtherApps:YES] сделали свое дело:

ProcessSerialNumber psn = { 0, kCurrentProcess }; 
OSStatus returnCode = TransformProcessType(& psn, kProcessTransformToForegroundApplication);

[NSApp activateIgnoringOtherApps:YES];

(я также добавил пользовательское меню, чтобы завершить его). Спасибо Манкарсе за указатели!

1 голос
/ 15 ноября 2011

Вам нужно NSApplication .. почему вы вообще делаете это?

Если вы создаете новое приложение с графическим интерфейсом, посмотрите на main.m и увидите, что оно порождает NSApplication там.

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

Это требует, чтобы у вас был пакет между прочим, и если вы хотите запустить утилиту командной строки без терминала, вы можете либо использовать launchd, либо создать пакет, который вы просто дважды щелкаете в окне поиска.

...