Какао-приложения из командной строки

Я пытался создать приложение 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, но не имеет значения (т.е. графический интерфейс загружен не полностью).


person kfb    schedule 15.11.2011    source источник
comment
Вы запускаете свою программу из пакета?   -  person Mankarse    schedule 15.11.2011
comment
В данный момент нет — я стараюсь избегать этого, если могу. Я не против иметь отдельный NIB, но в идеале я бы хотел, если это возможно, избежать всей структуры .app. Мой быстрый эксперимент с Calculator.app предполагает, что то, что мне нужно, возможно, если только оно не загружается в свой собственный пакет с помощью какой-то магии.   -  person kfb    schedule 15.11.2011


Ответы (2)


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

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

[NSApp activateIgnoringOtherApps:YES];

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

person kfb    schedule 17.11.2011

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

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

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

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

person Antwan van Houdt    schedule 15.11.2011
comment
Спасибо за ответ. У меня есть объект NSApplication (код не опубликован для ясности, но в основном он такой же, как в ссылке, которую я упомянул). Что касается того, почему я это делаю, так это потому, что код, который мне нужно запустить, является кросс-платформенным; Я заинтересован в создании окна, в котором может отображаться кросс-платформенный раздел, и я хотел бы знать, возможно ли это без всех обычных шаблонов приложений. - person kfb; 15.11.2011
comment
@р_. Это, конечно, возможно (но это зависит от недокументированных интерфейсов). Посмотрите, как это делают такие библиотеки, как SFML. Также взгляните на это. Вас также может заинтересовать взлом osx_tell_dock (см. здесь). - person Mankarse; 15.11.2011