启动NSTimer后如何更改显示的时间格式?

时间:2014-12-31 04:23:11

标签: ios objective-c nstimer nsdateformatter

我开始使用将大时钟作为用户界面的一部分的项目开始我的iOS体验。当我尝试将用户可调节的切换器从12小时切换到24小时时间格式时,我遇到了问题。在最初用户更改屏幕切换后,显示的时间"闪烁"两种格式之间。

我的方法:

  1. viewDidLoad设置用于12小时时间格式的属性并调用startTimer方法
  2. startTimer方法:NSDateFormatter已设置。 NSTimer以计划间隔启动,将 DateFormatter 传递给upDateTime方法
  3. updateTimer方法检查当前时间并设置屏幕
  4. 如果用户点击屏幕上的12小时/ 24小时分段控件,则IBAction使计时器无效并将所需的时间格式属性传递给startTimer方法
  5. 测试/观察:

    • 下面的代码显示了一种方法,我通过设置Locale并将其传递给 DateFormatter 来修改时间格式。我认为这可能是与设备Locale冲突的问题。我尝试使用自定义日期格式化程序(例如@" hh:mm a")代替闪烁问题。
    • NSTimer预定间隔显示为1秒。我有这个用于测试,但在0.1秒时看到相同的行为。
    • updateTime方法中的
    • NSLog调用显示, DateFormatter 对象ID和显示的时间在连续循环之间发生变化,即使用户未调整切换开关也是如此。
    • 我怀疑这可能与定时器的启动和停止方式有关。也许旧的"电话"以前的格式仍然在后台运行?我尝试将[updateTimer invalidate]移动到方法中的几个位置但没有成功

    根问题: 任何建议或更好的方法,使用用户开关12小时与24小时时间格式的屏幕时钟?显示的时间格式保持循环的原因是什么?

    代码:

    - (void)startTimer:(NSString *)displayedClockMode {
    
        // using locale within formatter overrides device system behavior chosen by user
        NSString *localeValue = nil;
        NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
        if([displayedClockMode isEqual:@"12-hr"]){
            //then 12 hr format - based on US locale
            localeValue = @"en_US_POSIX";
            //[timeFormatter setDateFormat:@"hh:mm a"];
        }
        else { //assume no other value exists
            // 24 hr format - based on GB locale
            localeValue = @"en_GB";
            //[timeFormatter setDateFormat:@"HH:mm"];
        }
    
        NSLocale *clockLocale = [NSLocale localeWithLocaleIdentifier:localeValue];
        [timeFormatter setLocale:clockLocale];
        [timeFormatter setTimeStyle:NSDateFormatterMediumStyle];
        //stop timer before re-starting with new format
        [self.updateTimer invalidate];
        self.updateTimer = nil;
    
        NSTimer *updateTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime:) userInfo:timeFormatter repeats:YES];
    }
    
    - (void)updateTime:(NSTimer *)updateTimer {
    
        NSDate *currentTime = [NSDate date];
    
        NSLog(@"old display time: %@",self.displayedTime.text);
    
        self.displayedTime.text = [updateTimer.userInfo stringFromDate:currentTime];
    
        NSLog(@"new display time: %@",self.displayedTime.text);
        NSLog(@"new timeformatter: %@",updateTimer.userInfo);
    
    }
    
    
    - (IBAction)displayedTimeMode:(id)sender {
    
        [self.updateTimer invalidate];
        self.updateTimer = nil;
    
        NSString *timeFormat = nil;
        if(self.displayedTimeToggle.selectedSegmentIndex == 0){
            //if 0, then 12 hr format
            timeFormat = @"12-hr";
        }
        else {
            // is 1, 24 hr format
            timeFormat = @"24-hr";
        }
    
        [self startTimer:timeFormat];
    
    }
    

1 个答案:

答案 0 :(得分:2)

问题是您有两个不同的updateTimers - self.updateTimer类变量和updateTimer局部变量。您正在使类变量无效,但在每次调用NSTimers期间初始化并运行具有不同语言环境的多个本地startTimer。这就是为什么你看到这种“闪烁” - 这是因为多个NSTimer正在使用不同的localeValues设置标签。

要解决此问题,请更改:

NSTimer *updateTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime:) userInfo:timeFormatter repeats:YES];

self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime:) userInfo:timeFormatter repeats:YES];