gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:34:44 27 4
gpt4 key购买 nike

我的 iOS 体验开始于一个项目,该项目将一个大时钟作为用户界面的一部分。当我尝试合并一个用户可调整的开关以从 12 小时制切换到 24 小时制时,我遇到了问题。在屏幕切换的初始用户更改后,显示的时间在两种格式之间“闪烁”。

我的方法:

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

测试/观察:

  • 下面的代码显示了一种方法,我通过设置区域设置并将其传递给 DateFormatter 来修改时间格式。我认为这可能是与设备区域设置冲突的问题。我尝试改用自定义日期格式化程序(例如 @"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];

}

最佳答案

问题是您有两个不同的 updateTimer -- self.updateTimer 类变量和 updateTimer 局部变量。您正在使类变量无效,但在每次调用 startTimer 期间初始化并运行具有不同语言环境的多个本地 NSTimers。这就是您看到这种“闪烁”的原因——这是因为多个 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];

关于ios - NSTimer 启动后如何更改显示的时间格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27716102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com