NSTimer не работает в приложении StopWatch ТОЛЬКО НА СИМУЛЯТОРЕ (показывает статическое странное число)

Когда я нажимаю на кнопку «Пуск», stopWatchLabel показывает следующее (его статические значения не выполняются):

  • ПРИМЕЧАНИЕ. Когда я тестирую это приложение на своем iPhone, все работает, как ожидалось. Вообще никаких проблем.

Может кто-нибудь объяснить, почему?

введите описание изображения здесь

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    NSTimer *stopWatchTimer; 
    NSDate *startDate;
}


@property (strong, nonatomic) IBOutlet UILabel *stopWatchLabel;

- (IBAction)startButtonTapped:(id)sender;

- (IBAction)stopButtonTapped:(id)sender;

-(void)updateTimer;

@end

.m

- (IBAction)startButtonTapped:(id)sender {

    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                                      target:self 
                                                    selector:@selector(updateTimer) 
                                                    userInfo:nil 
                                                     repeats:YES];
}


- (void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    stopWatchLabel.text = timeString;
}


- (IBAction)stopButtonTapped:(id)sender {

    [stopWatchTimer invalidate];
}

person Community    schedule 29.03.2012    source источник
comment
См. здесь, чтобы узнать часы и минуты непосредственно из NSTimeInterval . Нет необходимости создавать новую дату и форматировать ее.   -  person Joe    schedule 29.03.2012


Ответы (1)


вы не устанавливаете startDate

ваш код должен выглядеть так (я предполагаю, что это ARC):

- (IBAction)startButtonTapped:(id)sender {
    startDate = [NSDate date];

    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                                      target:self 
                                                    selector:@selector(updateTimer) 
                                                    userInfo:nil 
                                                     repeats:YES];
}

а updateTimer - смехотворно сложный метод разделения секунд на минуты и секунды. Сделайте базовую математику.

- (void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];

    NSInteger minutes = floor(timeInterval/60);
    NSInteger seconds = trunc(timeInterval - minutes * 60);

    NSString *timeString=[NSString stringWithFormat:@"%i:%02i", minutes, seconds];
    stopWatchLabel.text = timeString;
}

РЕДАКТИРОВАТЬ: На самом деле вы должны использовать встроенный NSCalendar / NSDateComponents API, потому что он не игнорирует летнее время, как основной математический метод.

- (void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [calendar components:NSSecondCalendarUnit|NSMinuteCalendarUnit fromDate:startDate toDate:currentDate options:0];
    NSInteger minutes = [components minute];
    NSInteger seconds = [components second];

    NSString *timeString=[NSString stringWithFormat:@"%i:%02i", minutes, seconds];
    stopWatchLabel.text = timeString;
 }
person Matthias Bauch    schedule 29.03.2012
comment
Спасибо, Матиас. Еще раз благодарю за вашу помощь. - person ; 29.03.2012