Die Rahmenwerke nehmen Ihnen viel Arbeit ab. Der einfache Aufruf von NSApplicationMain()
in Ihrem main.m
erledigt Dinge wie das Starten der Hauptanwendungsklasse (wie von der Info.plist
), laden Sie Ihr Haupt nib
, laden Sie die Hauptfenster und -menüs, richten Sie einen Standard-Pool für die automatische Speicherfreigabe ein und starten Sie die Ausführungsschleife (und vieles mehr!).
Es ist gut zu verstehen, welche "Magie" hinter den Kulissen abläuft, aber ich sehe nichts Falsches daran, die Rahmenprogramme einen großen Teil der Routinearbeit für Sie erledigen zu lassen. Und IB ist ein besonders schöner UI-Editor, es wäre eine Schande, ihn nicht zu benutzen! Wie auch immer, da du gefragt hast...
Sie sollten sich die folgenden Dokumente von Apples Developer Connection-Website durchlesen:
Um all dies programmgesteuert zu tun, müssten Sie also mindestens so etwas wie den folgenden Code verwenden. Beachten Sie, dass dies ein grober Anfang ist und weder einen Anwendungsdelegierten erstellt noch den Menüs etwas hinzufügt. Dies soll als Übung für den Leser dienen! Aber der folgende Code funktioniert im Grunde auf die von Ihnen beschriebene Weise, ohne IB zu verwenden.
// main.m
//
// NoIBApp - Create Application without IB
//
// Created by Gavin Baker on 23/01/10.
//
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
// Autorelease Pool
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// Create shared app instance
[NSApplication sharedApplication];
// Main window
NSUInteger windowStyle = NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask;
NSRect windowRect = NSMakeRect(100, 100, 400, 400);
NSWindow* window = [[NSWindow alloc] initWithContentRect:windowRect
styleMask:windowStyle
backing:NSBackingStoreBuffered
defer:NO];
// Test content
NSTextView* textView = [[NSTextView alloc] initWithFrame:windowRect];
[window setContentView:textView];
// Window controller
NSWindowController* windowController = [[NSWindowController alloc] initWithWindow:window];
// @todo Create app delegate
// @todo Create menus (especially Quit!)
// Show window and run event loop
[window orderFrontRegardless];
[NSApp run];
return 0;
}
Das ist keine vollständige Lösung, aber es sollte Ihnen den größten Teil des Weges ermöglichen. Sie können also Ihre OpenGL-Ansicht als contentView
(anstelle der Textansicht) und los geht's.