WindowController ohne Storyboard

In meinem letzten Artikel zur Cocoa-Programmierung habe ich ein Beispielprojekt unter Verwendung eines Storyboards erstellt. Diese Vorgehensweise ist seit OS X 10.10 möglich. Aber freilich geht es auch ohne Storyboard, was ich in diesem kleinen Tutorial zeigen möchte.

Ausgangspunkt ist ein NSWindowController. Denn OSX-Applikationen haben Fenster, wobei sich in manchen Programmen (fast) alles in einem Fenster abspielt (Fotos, Xcode), andere Programme jedoch mehrere Fenster nutzen. Zu jedem dieser Fenster gehört ein NSWindowController, der die grundlegende Funktionalität verwaltet (z.B. die Darstellung oder das Schließen eines Fensters).

Beginnen wir mit einem neuen Xcode-Projekt. Unter “OS X – Application” wählt Ihr “Cocoa Application” aus und klickt auf “Next”.

cocoa template

Weiter geht es mit einigen Optionen für das neue Projekt, das ich “CocoaProjekt” genannt habe. Achtet insbesondere darauf, dass bei “Use Storyboards” kein Häkchen gesetzt ist.

Projekt-Optionen

Xcode hat für uns bereits die Datei MainMenu.xib mit einem Window erzeugt. Damit wollen wir aber nicht arbeiten. Stattdessen soll ein ganz neues Fenster mit einer eigenen Controller-Klasse als Ausgangspunkt für unser Programm dienen. Wählt also im linken Navigations-Bereich MainMenu.xib und anschließend das Fenster (Window) aus und entfernt es. Wenn nun mit cmd + R das Projekt kompiliert wird, und die Applikation startet, wird kein Fenster erscheinen.

Nun erstellen wir unsere eigene Controller-Klasse. Wie Ihr Euch denken könnt, wird das eine Subklasse von NSWindowController sein. Klickt also im Navigations-Bereich mit der rechten Maustaste auf das gelbe Ordnersymbol mit dem Projektnamen “CocoaProjekt” (oder welchen Namen Ihr vergeben habt) und wählt aus dem Kontextmenü “New File” aus.

Im Bereich “OS X – Source” klickt Ihr auf “Cocoa Class” und anschließend auf “Next”.

Create new Cocoa class

Der Klasse gebe ich den Namen “StartWindowController”. Als Subklasse soll NSWindowController ausgewählt sein. Lasst das Häkchen bei “Also create XIB file for user interface” gesetzt.

Create new NSWindowController

Nach einem Klick auf “Next” und der Bestätigung des Speicherorts erscheinen im Navigator-Bereich zwei neue Dateien:

  • StartWindowController.swift und
  • StartWindowController.xib

Wenn Ihr das Projekt mit cmd + R kompiliert, wird immer noch kein Programmfenster erscheinen. Denn dafür ist noch etwas Code notwendig.

Öffnet “StartViewController.swift” und fügt gleich zu Beginn der Klasse folgenden Code hinzu:

override var windowNibName: String? {
    return "StartWindowController"
}

Damit erfährt die Controller-Klasse welche Xib-Datei genutzt werden soll.

Als nächstes geht es in die Datei “AppDelegate.swift”. Die Zeile

@IBOutlet weak var window: NSWindow!

kann gelöscht werden. Stattdessen erstellt Ihr hier eine neue Property:

// property
var startWindowController: StartWindowController?

Anschließend wird die Methode applicationDidFinishLaunching mit Inhalt gefüllt, so dass sie wie folgt aussieht:

func applicationDidFinishLaunching(aNotification: NSNotification) {

    // StartWindowController erzeugen und...
    let startWindowController = StartWindowController()

    // ...das Fenster anzeigen.
    startWindowController.showWindow(self)

    // Die lokale Variable startWindowController 
    // der Property startWindowController zuweisen.
    self.startWindowController = startWindowController

}

Der Code ist nicht sonderlich schwierig; anhand der Kommentare könnt Ihr nachvollziehen was passiert.

Wenn Ihr nun das Projekt startet, erscheint tatsächlich ein Fenster, das allerdings noch den nichtssagenden Namen “Window” trägt. Dies kann im Interfacebuilder — in der Datei “StartWindowController.xib” — angepasst werden. Dazu wählt Ihr das Fenster (Window) aus und vergebt im Attributes inspector bei “Title” einen neuen Namen.

Xcode's attributes inspector

Und damit sind wir am Ende des Tutorials angekommen. Ob man in einem Cocoa-Projekt ein Storyboard nutzt oder eher verschiedene Xib-Dateien anlegt, ist Geschmackssache. Ihr wählt am besten jenen Weg, der Euch am ehesten zusagt.