2012-02-07 1 views
4

Я попытался сделать обратный отсчет с NSTimeInterval. Но я хочу иметь возможность изменять интервал, не выпуская обновления каждый раз. Поэтому я попытался импортировать Timeinterval с моего сайта. Я сохранил номера для NSTimeInterval в NSString и теперь хочу их преобразовать в 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 ничего не делает ...

+0

чем проблема? кажется нормально –

+0

Как это не работает? Вы проверили (отобразив или посмотрев с помощью отладчика), что строковое значение идет правильно? Вы подтвердили правильность установки текста метки? –

+0

Что показывает label.text? – Shmidt

ответ

7

Ваш 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:. См. property list programming guide.

+0

Я попробовал его с txt-файлом, который должен работать лучше, чем html-файл, не так ли? – AmiiQo

+0

Если ваш txt-файл содержит только номер ни с чем другим, да. Поскольку вы хватаете номер из 'label.text', вы должны убедиться, что метка не ноль. Вместо этого вы можете попробовать «double timeInterval = [string doubleValue]». – mrb

+0

Загружает сейчас нужный файл: «Countdown [1538: f803] Скачано файл с контентом: 1354904016», но ярлык ничего не показывает ... – AmiiQo

1

вы шаг через код вообще (с помощью отладчика 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.

+0

Я добавил updateLabel, чтобы вы могли видеть, где я использую destinationDate ... Но он по-прежнему не работает с файлом txt – AmiiQo

+0

Кажется, что у вас сломанный IBOutlet. Бьюсь об заклад, ник. Поэтому любой код, который пытается взять значение из label.text, вернет нуль или нуль. –

2
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

+0

, если значение «66:66:66», конечное значение будет равно nil и [end timeIntervalSinceDate: start]; сбой приложения. – ayalcinkaya