2013-02-07 21 views
7

In this Antwort wird gesagt, es ist möglich, eine benutzerdefinierte NSWindowController durch Entfernen des Fensters von MainMenu.xib und Instanziieren des Fenster-Controller 'manuell' von applicationDidFinishLaunching:. Aber es sagt auch:Ist es möglich, einen benutzerdefinierten NSWindowController beim Start zu haben?

Um das Standardfenster vom Zeigen zu stoppen, lösche ich es einfach. Es gibt wahrscheinlich einen besseren Weg, aber das weiß ich nicht.

Ist dort ein besserer Weg? Was ist der bessere Weg, sollte es existieren? Wird es als "normale" Praxis angesehen, einen eigenen Fenstercontroller zu installieren?

Antwort

9

Um dies zu tun, würden Sie normalerweise NSWindowController ableiten und die Datei Owner-Klasse in Ihre WindowController-Unterklasse in der Feder ändern.

EDIT:

Wenn Sie kein Dokument-basierte Anwendung tun, und wollen nur ein NSWindowController der eigenen On-Demand tun Laden von Nibs (völlig in Ordnung), dann würden Sie das Fenster löschen aus Ihrer Feder und instanziiert programmatisch eine NSWindowController Unterklasse, die explizit dem Fenster Laden zu tun mit ...

@implementation MyApplicationDelegate { 
    MyWindowControllerSubclass *windowController; 
} 


-(void)applicationDidFinishLaunching:(NSNotification *)notification { 
    windowController = [[MyWindowControllerSubclass alloc] initWithWindowNibName:@"MyWindowNib"]; 

    [windowController showWindow:nil]; 
    [windowController.window makeKeyAndOrderFront:nil]; 
} 
+0

Leider funktioniert das nicht.Der ursprüngliche Besitzer ist NSApplication und Sie erhalten 2 Warnungen, wenn Sie dies ändern. Das Fenster erscheint, aber mein 'initWithWindow:' Fenstercontroller wird nicht aufgerufen, wie 'wakeFromNib' ... – 11684

+0

Verzeihen Sie mir, Sie ändern die Unterklasse in der MainMenu.nib nicht, Sie ändern es in der Feder Ihres Dokuments . Ich gehe davon aus, dass Sie eine dokumentenbasierte App erstellen. Ich glaube nicht, dass Sie einen NSWindowController erhalten, der sonst ersetzt werden muss, nicht standardmäßig. Wenn Sie keine dokumentenbasierte App erstellen, ist es in der Tat das Beste, das Boilerplate-Fenster zu löschen und eine NSWindowController-Unterklasse Ihrer eigenen Anwendung in applicationDidFinishLaunch zu installieren: und verwenden Sie sie, um Ihr Fenster programmgesteuert aus einem separaten Fenster zu laden. Vorbohrerspitze. – iluvcapra

+0

Nein, es ist keine dokumentenbasierte App. Aber dann mach ich das! Vielen Dank! – 11684

0

ich fand einen anderen Weg: NSWindowController die Methode -initWithWindow: hat. Da die App Delegate eine Eigenschaft haben window, die an das Fenster von MainMenu.xib beim Start verknüpft ist, war es leicht, es zu meinem WindowController verlinken:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    MyWindowController *wincon = [[MyWindowController alloc] initWithWindow:window]; 
} 

ich noch, dies zu erforschen, aber ich komme nicht Fehler.

7

Ich stieß auf das gleiche Problem und ich möchte Ihnen meine eigene Lösung zeigen.

  1. erstellen normale Cocoa-Anwendung (nicht Dokument basiert)
  2. Zum MainMenu.xib ein das Fenster
  3. Go ahead löschen und eine neue Datei erstellen, User Interface -> Fenster
  4. Danach erstellen Sie eine Unterklasse von NSWindowController
  5. Öffnen Sie die soeben erstellte XIB-Datei und setzen Sie die Custom Class in die Identi ty Inspektor auf die soeben erstellte Unterklasse von NSWindowController
  6. Rechtsklick auf Management-Datei und schließen Sie das Fenster Eigenschaft zum aktuellen Fenster
  7. zum AppDelegate Gehen Sie nun eine eine Instanzvariable erstellen, die Sie CustomWindowController
  8. Last hält was Sie tun müssen, ist Ihre CustomWindowController self.customWindowController = [[AccountWindowController alloc] initWithWindowNibName:@"CustomWindow"]; instanziiert und das Fenster [self.customWindowController showWindow:nil] in - (void)applicationDidFinishLaunching:(NSNotification *)aNotification

Hier zeigen ein Beispielprojekt https://www.dropbox.com/s/ft3t7w72806tnoe/CustomWindowController.zip

+0

Während ich weiß, dass Sie sich die Zeit genommen haben zu antworten, ist dies eine Art Duplikat von iluvcapras Antwort. – 11684

+0

Sie sind völlig richtig. Das habe ich nicht gesehen! Habe gerade das gleiche hier gemacht und dachte ich antworte schnell. – tuna

+0

@tuna ur Antwort war hilfreicher, als es Schritt für Schritt Anleitung gab –

Verwandte Themen