Конвертировать NSString в NSTimeInterval - PullRequest
4 голосов
/ 07 февраля 2012

Я пытался сделать обратный отсчет с помощью NSTimeInterval. Но я хочу иметь возможность изменять интервал без выпуска обновления каждый раз. Поэтому я попытался импортировать Timeinterval с моего сайта. Я сохранил числа для NSTimeInterval в NSString и теперь хочу преобразовать их в NSTimeInterval, чтобы внедрить их в код обратного отсчета ...

... но это не работает. Есть идеи?

label.text = string;
double timeInterval = [label.text doubleValue];
NSTimeInterval intervalForTimer = timeInterval;
destinationDate = [[NSDate dateWithTimeIntervalSince1970:intervalForTimer] retain];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];

редактирование:

- (void)updateLabel {

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    int units = NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents *components = [calendar components:units fromDate:[NSDate date] toDate:destinationDate options:0];
    [dateLabel setText:[NSString stringWithFormat:@"%d%c %d%c %d%c %d%c %d%c", [components month], 'm', [components day], 'd', [components minute], 'm', [components second], 's']];

}

Мой новый код выглядит так:

    NSLog(@"Downloaded file with contents: %@", string);
    double timeInterval = [string doubleValue];
    label.text = [NSString stringWithFormat:@"%d", (int)timeInterval];
    NSTimeInterval intervalForTimer = timeInterval;
    destinationDate = [[NSDate dateWithTimeIntervalSince1970:timeInterval] retain];
    timer = [NSTimer scheduledTimerWithTimeInterval:intervalForTimer target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];

Но dateLabel ничего не делает ...

Ответы [ 3 ]

7 голосов
/ 07 февраля 2012

Ваш URL, http://gymnasium2.ai.ch/~mensa/countdown_timestamp.html, - это полный HTML-файл. NSString initWithContentsOfURL: вернет строку, содержащую все ее содержимое:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>1328633219</title>
</head>

<body>
1328633219
</body>
</html>

Это нельзя преобразовать в двойное число; вам нужно разобрать HTML, что может быть довольно трудоемким.

Было бы проще создать простой файл, содержащий только число:

1328633219

Тогда ваш код выше сможет получить номер без каких-либо изменений.

Однако следующий код может помешать работе вашего кода:

NSString *string = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://gymnasium2.ai.ch/~mensa/countdown_timestamp.html"]];
label.text = string; // This line
double timeInterval = [label.text doubleValue];

Если label равен nil, то timeInterval не будет установлен должным образом, поскольку [label.text doubleValue] также вернет nil. Вместо этого вы можете попробовать:

NSString *string = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://gymnasium2.ai.ch/~mensa/countdown_timestamp.html"]];
double timeInterval = string;
label.text = [NSString stringWithFormat:@"%d", (int)timeInterval];

Было бы полезно сбросить точку останова или добавить вызов NSLog после извлечения файла, чтобы вы могли видеть, что происходит.

NSString *string = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://gymnasium2.ai.ch/~mensa/countdown_timestamp.html"]];
NSLog(@"Downloaded file with contents: %@", string);

Кроме того, вы можете загрузить файл plist и использовать что-то вроде NSDictionary dictionaryWithContentsOfURL: или NSArray arrayWithContentsOfURL:. См. Руководство по программированию списка свойств .

2 голосов
/ 21 августа 2013
NSTimeInterval timeInterval = [self timeIntervalFromString:@"00:01:40"];
NSLog(@"timeInterval %f", timeInterval);

- (NSTimeInterval)timeIntervalFromString:(NSString *)string {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSDate *start = [dateFormatter dateFromString:@"00:00:00"];
NSDate *end = [dateFormatter dateFromString:string];
NSTimeInterval interval = [end timeIntervalSinceDate:start];
return interval;
}

вывод: timeInterval 100.000000

1 голос
/ 07 февраля 2012

прошел ли ты весь код (используя отладчик Xcode), чтобы увидеть, какая строка твоего кода получила неожиданные результаты? Вы никогда не используете destinationDate, и на самом деле вы должны перейти к последней строке кода:

timer = [NSTimer scheduledTimerWithTimeInterval:intervalForTimer target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];

Кроме того, местом, откуда вы получаете значение временного интервала, является веб-страница с HTML-тегами вокруг нее. Измените countdown_timestamp.html на countdown_timestamp.txt и просто поместите в него значение своего временного интервала (например, "2.0"). Не оборачивайте это в HTML.

...