Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
Eine ganz besondere Uhr

Zum Abschluss ein weiteres kurzes Beispiel, das sich mit dem NSTimer beschäftigt. Dieses Mal werden Sie eine ganz besondere Uhr erstellen, welche die Zeit nicht nur als Zahlen, sondern auch in Form mehrerer NSProgressIndicator darstellt.

Nennen Sie dieses Projekt: besondereUhr

Erstellen Sie zuerst die MyController.h
#import <Cocoa/Cocoa.h>

@interface MyController : NSObject {

    IBOutlet NSProgressIndicator *progressSec;
    IBOutlet NSProgressIndicator *progressMin;
    IBOutlet NSProgressIndicator *progressHour;
    IBOutlet NSTextField *currentTime;
    NSTimer *aTimer;
}

@end
Mit einem NSProgressIndicator haben Sie bisher noch nicht gearbeitet, aber es ist ein sehr einfaches Steuerelement. Vielleicht kennen Sie es besser unter dem Namen „Fortschrittsbalken“.

Ihr Fenster für diese Anwendung sollte in etwas so aussehen:
stacks_image_CF650F70-3DBB-4774-9154-9B296197AF38
Sie können den Maximal- und Minimalwert der NSProgressIndicator schon im Inspector festlegen, wir werden das aber später im Code erledigen. Wichtig ist, dass Sie die Eigenschaft Indeterminiate deaktivieren.
stacks_image_798DE3F8-FE6F-4782-A5F5-51711E608733
Die Uhrzeit in diesem Programm wird ganz einfach mit einem NSTextField (Label) dargestellt, allerdings in einer etwas größeren Schriftart. Ziehen Sie ein NSTextField auf ihr Programmfenster und verändern Sie die Schriftgröße. Dazu müssen Sie das Schriften-Fenster einblenden. Dieses erreichen Sie mit dem Font-Menu des Interface Builder oder durch die Tastenkombination cmd + T.
stacks_image_99666A3F-1451-4519-B800-4D1BF65C0ED8
Zurück zum Code. In der awakeFromNib-Methode werden die Grenzwerte für die NSProgressIndicator gesetzt und der NSTimer gestartet.
-(void) awakeFromNib
{
    [progressSec setMaxValue:
59];
    [progressSec setMinValue:
0];

    [progressMin setMaxValue:
59];
    [progressMin setMinValue:
0];

    [progressHour setMaxValue:
23];
    [progressHour setMinValue:
0];

    aTimer = [NSTimer scheduledTimerWithTimeInterval:
1 target:self selector:
     @selector(tick:) userInfo:nil repeats:YES];
    [aTimer fire];
}
In der tick-Methode wird immer wieder das aktuelle Datum/Uhrzeit geholt und als Text an das NSTextField gesendet. In diesem Beispiel verwenden wir NSCalendarDate. Diese von NSDate abgeleitete Klasse hat einige zusätzliche Funktionen. So kann man zum Beispiel die Sekunden, Minuten und Stunden des Zeitwertes explizit abfragen. Diese Werte werden dann direkt an die NSProgressIndicator gesendet und die Uhr ist fertig, nachdem Sie auch im Interface Builder die nötigen Schritte gemacht haben.
- (void)tick:(NSTimer *)theTimer
{
    NSCalendarDate *theDate;
    theDate = [NSCalendarDate date];
    [currentTime setStringValue:[theDate descriptionWithCalendarFormat:
     @"%H:%M:%S"timeZone:nil locale:[[NSUserDefaults standardUserDefaults]
     dictionaryRepresentation]] ];

    [progressSec setDoubleValue:(
double)[theDate secondOfMinute]];
    [progressMin setDoubleValue:(
double)[theDate minuteOfHour]];
    [progressHour setDoubleValue:(
double)[theDate hourOfDay]];
}
stacks_image_2C4B5F54-C444-4984-83A8-E1E2E668DD66