Создать окно Mojave Cocoa программно в Objective-C - PullRequest
0 голосов
/ 18 февраля 2019

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

#import <Cocoa/Cocoa.h>

int main (int argc, const char * argv[]){
    NSWindow *window = [[NSWindow alloc] init];
    [window makeKeyAndOrderFront:nil];
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false)
    while (1);
    return 0;
}

Я хотел бы, как отобразить окно без вызова CFRunLoopRunInMode ().

Xcode 10.1

MacOS 10.14.3

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я думаю, что нашел ответ сам.Окно не появляется, если оно не получает сообщение nextEventMatchingMask :.Это, вероятно, то, что вызывает окно в CFRunLoop, и это то, что я хотел знать, хотя было бы неплохо, если бы я мог копать глубже.Пока я доволен следующим решением.

#import <Cocoa/Cocoa.h>
int main (int argc, const char * argv[]){
@autoreleasepool {
    // Create a default window
    NSWindow *window = [[NSWindow alloc] init];
    // Make it blue just for better visibility
    [window setBackgroundColor:[NSColor blueColor]];
    // Bring to front and make it key
    [window makeKeyAndOrderFront:nil];
    // Custom run loop
    NSEvent* event;
    while(1) {
        do {
            event = [window nextEventMatchingMask:NSEventMaskAny]; //window shows now
            if ([event type] == NSEventTypeLeftMouseDown) {
                NSLog(@"Mouse down");
            }
            else {
                NSLog(@"Something happened");
            }
        } while (event != nil);
    }
}
return 0;
}

У меня нет ссылки на это.Я могу ссылаться только на эту статью: Handmade Hero для mac , в которой появляется окно из-за подобного метода.Для меня этого было недостаточно, потому что в таком методе используется NSApp, которого я хотел бы избежать, если это возможно.

0 голосов
/ 18 февраля 2019

То, что у вас есть, не является приложением Какао.

Вам необходимо использовать шаблон Xcode, чтобы создать простое приложение Какао с одним окном.Этот шаблон будет включать main(), который запускает AppKit (NSApplicationMain(argc,argv);).Эта функция выполняет (приблизительно) 5000 мелочей, которые запускают приложение Cocoa.

В Info.plist комплекта приложения вы либо определяете пользовательский подкласс NSApplication для запуска своего приложения, либо, что гораздо чаще,в MainMenu.xib вы определяете пользовательский объект NSApplicationDelegate.

После того, как AppKit инициализирован и готов к запуску вашего приложения, оба этих объекта получат сообщение, которое вы можете переопределить, и добавьте свой пользовательский код запуска..

Стандартный шаблон делает все это, поэтому просто используйте его для создания нового проекта, а затем добавьте свой код в -applicationDidFinishLaunching:.

...