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

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

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

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

enter image description here

.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];
}

1 Ответ

0 голосов
/ 29 марта 2012

вы не установили 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;
}

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

- (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;
 }
...