Tab Bar Tutorial (Version 2)

Nachdem ich ja bereits geschrieben habe, dass ich inzwischen vom Interface Builder abgekommen bin (zumindest Großteils; um eine View zu entwerfen und die Daten dann im Code zu übernehmen ist der IB durchaus ganz brauchbar) beginne ich mal mit der ersten Anleitung ohne den IB.

Wie bereits zuvor beginne ich mit einer TabBar Applikation. Dabei soll einfach eine Applikation entstehen, die 2 verschiedene Views enthält, zwischen denen man mit Hilfe einer TabBar umschalten kann. Das grundsätzliche Vorgehen bei der Projekterstellung bleibt dabei gleich, d.h. zuerst wird ein neues Projekt vom Typ iPhone OS Window-Based Application erstellt. Da ich die Applikation TabBar genannt habe, erzeugt XCode eine Hauptklasse TabBarAppDelegate.m.

Zusätzlich dazu erstelle ich zwei weitere Klassen, für jede View eine eigene Klasse, die vom Typ UIViewController subclass sind, und die ich sinnvollerweise First.m sowie Second.m nenne. In jeder dieser beiden Views erstelle ich in der Methode loadView ein Label, welches den Text “First View” bzw. “Second View” anzeigen soll. Diese beiden Klassen sind eigentlich selbsterklärend und sehen wie folgt aus (die Header-Dateien First.h und Second.h habe ich dabei nicht modifiziert):

First.m:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import "First.h"

@implementation First

- (void)loadView {
    [super loadView];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0)];
    label.textAlignment = UITextAlignmentCenter;
    label.text = @"First View";

    [self setView:label];

    [label release];
}

@end

Second.m:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import "Second.h"

@implementation Second

- (void)loadView {
    [super loadView];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0)];
    label.textAlignment = UITextAlignmentCenter;
    label.text = @"Second View";

    [self setView:label];

    [label release];
}

@end

Im Hauptprogramm, d.h. in der TabBarAppDelegate erstelle ich von jedem der beiden ViewController First und Second eine neue Instanz (Zeile 13 und 14). Ein ViewController besitzt die Property tabBarItem, bei der man den Titel angeben kann (.title), der auf dem zugehörigen Tab dargestellt werden soll, sowie auch ein dazugehöriges Icon (.image). Die beiden Tabs werden hier ebenfalls mit “First” und “Second” tituliert (Zeile 16 und 17). Anschließend wird ein neuer UITabBarController erstellt (Zeile 19) sowie mitgeteilt welche Views (bzw. Tabs) er darstellen soll (Zeile 20). Letztendlich wird dem aktuellen Window der Applikation der UITabBarController als Subview gesetzt (Zeile 22).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#import "TabBarAppDelegate.h"

#import "First.h"
#import "Second.h"

@implementation TabBarAppDelegate

@synthesize window;

UITabBarController *tabBarController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    First  *firstViewController  = [[First  alloc] initWithNibName:nil bundle:nil];
    Second *secondViewController = [[Second alloc] initWithNibName:nil bundle:nil];

    firstViewController.tabBarItem.title  = @"First";
    secondViewController.tabBarItem.title = @"Second";
   
    tabBarController = [[UITabBarController alloc] init];
    tabBarController.viewControllers = [NSArray arrayWithObjects:firstViewController, secondViewController, nil];

    [window addSubview:[tabBarController view]];

    [firstViewController  release];
    [secondViewController release];

    [window makeKeyAndVisible];
}

- (void)dealloc {
    [tabBarController release];

    [window release];
    [super dealloc];
}

@end

Und das war schon die ganze Hexerei. Irgendwie weitaus einfacher und schneller als mit dem Interface Builder, und außerdem weiß man so in etwa was dabei passiert. Da das ganze so trivial ist halte ich es nicht für notwendig ein Archiv des Projektes zum Download zur Verfügung zu stellen, ich kann es bei Bedarf aber durchaus gerne weitergeben.


Leave a Reply