Mrz 11 2009

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.


Mrz 5 2009

Slow Blogging Days

Ich hab gerade auf Rebel Science News gelesen:

I am intensely involved in a programming project and I am finding it hard to change my focus to other matters. As a result, my blogging activities will be less frequent. Please bear with me.

Das kann ich nur unterschreiben. Aber mein Programm macht durchaus Fortschritte. Außerdem sollte ich jetzt demnächst neue iPhone-HowTo’s (ohne Interface Builder) posten, aber im Moment bin ich eher mim programmieren beschäftigt (und Diplomarbeit sollt ich wohl auch irgendwann mal machen).