我开始使用将大时钟作为用户界面的一部分的项目开始我的iOS体验。当我尝试将用户可调节的切换器从12小时切换到24小时时间格式时,我遇到了问题。在最初用户更改屏幕切换后,显示的时间"闪烁"两种格式之间。
我的方法:
viewDidLoad
设置用于12小时时间格式的属性并调用startTimer方法NSDateFormatter
已设置。 NSTimer
以计划间隔启动,将 DateFormatter 传递给upDateTime方法IBAction
使计时器无效并将所需的时间格式属性传递给startTimer方法测试/观察:
NSTimer
预定间隔显示为1秒。我有这个用于测试,但在0.1秒时看到相同的行为。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];
}
答案 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];