Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS 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_4108764B-F59C-4AE3-A6CD-C5FE83A4DB0C
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_A0EB4F06-38A6-464E-8749-6F9F49EC82F5
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_BB71912F-DC10-4E0C-9B55-FB421D9E998D
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_D497FD93-85D5-4F0E-8FD5-54EA93200A65