【问题标题】:Stopwatch messed up after switching back from another tab从另一个选项卡切换回来后秒表搞砸了
【发布时间】:2012-12-31 05:52:34
【问题描述】:

我有一个秒表,它本身就可以正常工作,但是当我从标签栏从另一个视图切换回来时,秒表会做一些奇怪的事情(点击导航视图上的后退按钮可以正常工作)。

  1. 当用户从另一个选项卡切换回来时,秒表标签会被隐藏,即使在显示视图时它应该是可见的。

  2. 如果当用户点击另一个选项卡并再次点击秒表选项卡时秒表正在运行,秒表将转到 -31:-23.-64,并且停止按钮(应该重置计时器并显示开始按钮)点击时不会执行任何操作。

  3. 如果用户点击另一个选项卡并再次点击秒表选项卡时秒表未运行,则秒表将正常启动,但用户点击开始按钮时停止按钮不显示。

这是我的代码:

.h:

@interface ViewController : UIViewController {
    IBOutlet UIButton *btnStart;
    IBOutlet UIButton *btnStop;
    IBOutlet UILabel *lblTimer;
    NSTimer *stopWatchTimer;
    NSDate *stopDate;
    NSDate *startDate;

}

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

- (IBAction)btnStart:(id)sender;
- (IBAction)btnStop:(id)sender;

.m:

- (void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"mm:ss.SS"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    lblTimer.text = timeString;
}

- (IBAction)buttonStart:(id)sender {

    startDate = [NSDate date];

    // Create the stop watch timer that fires every 1ms
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/100.0
                                                      target:self
                                                    selector:@selector(updateTimer)
                                                    userInfo:nil
                                                     repeats:YES];
    btnStop.hidden = NO;
    btnStart.hidden = YES;
}

- (IBAction)buttonStop:(id)sender {

    [self updateTimer];
    btnStop.hidden = YES;
    btnStart.hidden = NO;

    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
}

请让我知道我可以做些什么来解决这个问题,或者是否需要其他任何东西。

【问题讨论】:

  • 你在秒表的 viewController 的 viewwillAppear 方法中做了什么吗?
  • 不,viewDidAppear 中也没有,应该有吗?
  • 不,我的意思是您的问题可能是由于 viewwillappear 中的某些属性更改。因为这个函数总是在你改变你的标签时被调用
  • 您应该发布更多代码。图片不够清晰。顺便说一句,您每秒创建 100 个NSDateFormatters,无论如何您都在尝试,这太可怕了!即使是性能非常出色的游戏也只能以大约 60fps 的速度重绘,为什么你还需要 100fps?但无论如何,更多代码将帮助我们找到您的实际问题。

标签: objective-c uitabbarcontroller nsdate nstimer uitabbar


【解决方案1】:

首先,看起来 startDate 搞砸了。正在调用init。应该是[NSDate date]

至于视图没有出现......在计算日期后,timer.text 被设置为某个值。什么是定时器?你确定不应该是timer.title 吗?完成此操作后,您可能需要[timer setNeedsDisplay] 以确保控件上的文本已更新(如果这是您想要的)。

如果文本仍然混乱,请尝试减少更新频率。可能每隔十秒,看看文本是否表现得更好。

【讨论】:

  • 好的,我刚刚更新了我的代码以反映 timer 是一个标签,并添加了 .h 文件以显示我的其他对象是什么。我还将[[NSDate date] init] 更改为[NSDate date],并与[lblTimer setNeedsDisplay] 一起测试了它,并减少了更新计时器的频率,但没有发生任何不同。有什么想法吗?
  • 抱歉,刚刚发现问题...我在viewWillDisappear 方法中将一个太多的东西设置为nil。不过感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多