Frage

Ich bin die ersten Schritte für das iPhone zu entwickeln und als solche ich bei verschiedenen Tutorials Suche sowohl online als auch einige andere Dinge selbst zu versuchen. Derzeit bin ich versucht, einen Countdown bis Mitternacht zu erstellen. Um die Anzahl der Stunden, Minuten und Sekunden, ich folgend (die ich irgendwo gefunden):

NSDate* now = [NSDate date];

int hour = 23 - [[now dateWithCalendarFormat:nil timeZone:nil] hourOfDay];
int min = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] minuteOfHour];
int sec = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] secondOfMinute];
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min,sec];

Doch jeder Ort, den ich -dateWithCalendarFormat:timeZone: verwende ich die folgende Fehlermeldung erhalten:

warning: 'NSDate' may not respond to '-dateWithCalendarFormat:timeZone:'
(Messages without a matching method signature will be assumed to return 'id' and accept '...' as arguments.)
warning: no '-hourOfDay' method found
error: invalid operands to binary - (have 'int' and 'id')

Dies scheint etwas sehr einfach. Was bin ich?

Außerdem habe ich an verschiedenen Stellen bemerkt und zu verschiedenen Zeiten das Sternchen (*) entweder gleich nach dem Zeitpunkt NSDate* now oder direkt vor der Variablen NSDate *now entfernt. Was ist der Unterschied in den beiden und warum Sie eine im Vergleich zu den anderen verwenden würde?

War es hilfreich?

Lösung

Sie müssen die folgende verwenden:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [gregorian components:(NSHourCalendarUnit  | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:yourDateHere];
NSInteger hour = [dateComponents hour];
NSInteger minute = [dateComponents minute];
NSInteger second = [dateComponents second];
[gregorian release];

Es gibt keinen Unterschied zwischen NSDate * jetzt und NSDate * jetzt, es ist nur eine Frage der Präferenz. Vom Compiler Perspektive ändert sich nichts.

Andere Tipps

Sie haben Probleme mit iOS 4.2? Verwenden Sie diesen Code:

NSDate *currDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"dd.MM.YY HH:mm:ss"];
NSString *dateString = [dateFormatter stringFromDate:currDate];
NSLog(@"%@",dateString);

-> 20.01.2011 10.36.02

Sie können auch verwendet werden:


CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem());
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02.0f", currentDate.hour, currentDate.minute, currentDate.second];
CFRelease(currentDate); // Don't forget this! VERY important

Ich denke, das hat die folgenden Vorteile:

  1. Keine direkte Speicherzuordnung.
  2. Sekunden ist eine doppelte statt einer ganzen Zahl.
  3. Keine Meldung aufruft.
  4. Schneller.

// können Sie das aktuelle Datum / Zeit mit dem folgenden Code erhalten:

    NSDate* date = [NSDate date];
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];
    formatter.timeZone = destinationTimeZone;
    [formatter setDateStyle:NSDateFormatterLongStyle];
    [formatter setDateFormat:@"MM/dd/yyyy hh:mma"];
    NSString* dateString = [formatter stringFromDate:date];

Ersetzen Sie diese:

NSDate* now = [NSDate date];
int hour = 23 - [[now dateWithCalendarFormat:nil timeZone:nil] hourOfDay];
int min = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] minuteOfHour];
int sec = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] secondOfMinute];
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min,sec];

Mit diesem:

NSDate* now = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [gregorian components:(NSHourCalendarUnit  | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now];
NSInteger hour = [dateComponents hour];
NSInteger minute = [dateComponents minute];
NSInteger second = [dateComponents second];
[gregorian release];
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second];
  

Außerdem habe ich an verschiedenen Stellen bemerkt und zu verschiedenen Zeiten der Stern (*) entweder gleich nach dem Zeitpunkt NSDate* now oder direkt vor der Variablen NSDate *now entfernt. Was ist der Unterschied in den beiden und warum Sie eine im Vergleich zu den anderen verwenden würde?

Der Compiler kümmert sich nicht darum, sondern das Sternchen vor dem Raum setzen kann irreführend sein. Hier ist mein Beispiel:

int* a, b;

Was ist die Art der b?

Wenn Sie int * erraten, dann irren Sie sich. Es ist nur int.

Die andere Art und Weise macht dies etwas deutlicher durch die Beibehaltung * neben den Variablen es gehört zu:

int *a, b;

Natürlich gibt es zwei Möglichkeiten, die noch deutlicher als das sind:

int b, *a;

int *a;
int b;

Sie müssen etwas entlang der Linien der folgenden Funktionen ausführen:

NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:now];
NSLog(@"%d", [components hour]);

Und so weiter.

Hier ist eine andere Art und Weise:

NSDate *now = [NSDate date];

//maybe not 100% approved, but it works in English.  You could localize if necessary
NSDate *midnight = [NSDate dateWithNaturalLanguageString:@"midnight tomorrow"]; 

//num of seconds between mid and now
NSTimeInterval timeInt = [midnight timeIntervalSinceDate:now];
int hours = (int) timeInt/3600;
int minutes = ((int) timeInt % 3600) / 60;
int seconds = (int) timeInt % 60;

Sie verlieren Subsekunden Präzision mit der Besetzung des NSTimeInterval in einem int, aber das sollte keine Rolle spielen.

NSDate* now und NSDate *now sind die gleiche Sache. Ein Zeiger auf ein Objekt NSDate

Sie wollen wahrscheinlich verwenden descriptionWithCalendarFormat: Zeitzone: locale: statt dateWithCalendarFormat: - letztere kehrt ein NSCalendarDate, die die docs sagen soll um einige veraltet werden Punkt.

Original Poster - so, wie Sie Sekunden bis Mitternacht sind die Bestimmung nicht an einem Tag arbeiten, wenn die Sommerzeit beginnt oder endet. Hier ist ein Stück Code, der zeigt, wie es geht ... Es in Sekunden sein wird (ein NSTimeInterval); Sie können die Abteilung / Modul / etc tun, um unten zu erhalten, was Sie brauchen.

NSDateComponents *dc = [[NSCalendar currentCalendar] components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:[NSDate date]];
[dc setDay:dc.day + 1];
NSDate *midnightDate = [[NSCalendar currentCalendar] dateFromComponents:dc];
NSLog(@"Now: %@, Tonight Midnight: %@, Hours until midnight: %.1f", [NSDate date], midnightDate, [midnightDate timeIntervalSinceDate:[NSDate date]] / 60.0 / 60.0);

Es gibt keinen Unterschied in der Lage des Sternchens (bei in C, die Obj-C auf basiert, es spielt keine Rolle). Es ist rein Präferenz (Stil).

Es dauerte eine Weile, warum die Beispielanwendung Arbeiten zu finden, aber ich nicht.

Die Bibliothek (Foundation.Framework), dass der Autor bezieht sich auf die Systembibliothek (ab OS), wo das iphone sdk (I 3.0 verwenden) nicht mehr ist unterstützen.

Deshalb ist die Beispielanwendung (von about.com, http://www.appsamuck.com/day1 .html ) funktioniert, aber uns nicht.

CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem());
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%2.0f", currentDate.hour, currentDate.minute, currentDate.second];

Mark hatte Recht dieser Code ist viel effizienter Termine Stunden min und Sekunden zu verwalten. Aber er vergaß die @ am Anfang der Formatstring-Deklaration.

+ (NSString *)displayCurrentTimeWithAMPM 
{
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"h:mm aa"];

    NSString *dateTime = [NSString stringWithFormat:@"%@",[outputFormatter stringFromDate:[NSDate date]]];

    return dateTime;
}

Rückkehr 3.33

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top