Einen eigenen ViewController als rootViewController festlegen

Ich halte ja nicht wirklich viel von vorgefertigten Templates. Das betrifft sowohl HTML, PHP als auch jede andere Sprache. Und gerade jetzt auch wieder mit Objective-C und XCode. Ok, Apple hat es wahrscheinlich gut gemeint und jede Menge Templates vorgefertigt um dem Programmierer etwas arbeit abzunehmen. Das Problem liegt aber im Detail. Durch die Templates wird jede Menge Code eingeschleust der unter Umständen erst einmal geändert werden muss. Meistens betrifft das die Variablen, Klassen bzw. Methodennamen. Man möchte ja schlieslich die eigenen Namen in den Projekten durchgängig verwenden.

Also fangen wir an und erstellen uns erst einmal ein neues Projekt. Als Template wählen wir natürlich eine Empty Application. Hier erstellt uns dann XCode eine Application die lediglich eine AppDelegate.h bzw. eine AppDelegate.m Datei beinhaltet. Wenn wir diese jetzt bereits starten meckert XCode das kein rootViewController vorhanden ist. Und genau den wollen wir ja auch selber erstellen. Also fügen wir der Application eine UIView subclass hinzu und setzen die Option das XCode auch gleich noch eine xib Datei erstellen soll. Die neue Klasse heist bei mir ScreenStartViewController und wird im nächsten Schritt in die Application eingebaut.

Die AppDelegate.h sollte in etwa so aussehen

#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

Hier fügen wir lediglich 2 Zeilen Code ein und die AppDelegate.h sollte nun so ausschauen:

#import <UIKit/UIKit.h>
@class ScreenStartViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ScreenStartViewController *screenStartViewController;

@end

Widmen wir uns nun der AppDelegate.m. Diese ist ein klein wenig umfangreicher. Wir müssen aber nur die Funktion didFinishLaunchingWithOptions erweitern. Vorher müssen wir aber noch unseren eigenen viewController importieren und implementieren. Der Kopf der AppDelegate.m sollte zu diesem Zeitpunkt so aussehen:

#import "AppDelegate.h"
#import "ScreenStartViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize screenStartViewController;

Alles was wir Implementieren müssen wir auch wieder releasen. Das passiert in der dealoc Methode. Diese ändern bzw. erstellen diese wie folgt:

- (void)dealloc {
    [_window release];
    [screenStartViewController release];
    [super dealloc];
}

Zu guter Letzt machen wir den neuen ViewController dann zum rootViewController und ändern entsprechend die didFinishLaunchingWithOptions Methode: 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    self.screenStartViewController = [[[ScreenStartViewController alloc] initWithNibName:@"ScreenStartViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.screenStartViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

Jetzt kann der ScreenStartViewController mit den notwendigen Elementen wie Label, Textfelder und/oder Buttons bestückt und die Application auf dem iPhone gestartet werden. Alle anderen Methoden in der AppDelegate.m können im Code bestehen bleiben und sind selbsterklärend. Gegebenenfalls kann man diese erweitern und ändern.