如何从自定义Timer对象更新视图

时间:2013-08-16 15:57:48

标签: ios objective-c delegates nstimer

我正在构建一个带有计时器的应用程序,我已经创建了一个自定义类Timer,它是NSTimer类的包装器。它有一个名为remainingTime的属性,它会在计时器运行时定期更新。

我的视图控制器TimerVC实例化一个Timer对象,需要根据timer.remainingTime更新其视图。我该如何实现这一目标?

我相信我应该在这里使用代表,但我不知道它会如何运作。哪个类应该实现委托方法?

或者我的方法可能都错了?

编辑:我没有在TimerVC中使用NSTimer的原因是因为我想抽象它以便重复使用,并且还将它与视图分离。

这是我的Timer类的代码:

#import "Timer.h"

#define SECONDS_INTERVAL 1

@interface Timer()

@property (strong, nonatomic) NSTimer *timer;
@property NSInteger seconds;
@property NSInteger secondsRemaining;

@end


@implementation Timer
- (Timer *)initWithSeconds:(NSInteger)seconds {
    self = [super init];
    if (self) {
        self.seconds = seconds;
        self.secondsRemaining = self.seconds;
    }
    return self;
}

- (void)start {
    self.timer = [NSTimer timerWithTimeInterval:SECONDS_INTERVAL target:self selector:@selector(updateSecondsRemaining) userInfo:nil repeats:YES];
}

- (void)pause {

}

- (void)stop {
    [self.timer invalidate];
    self.timer = nil;
}

- (void)reset {
    [self stop];
    self.secondsRemaining = self.seconds;
}

- (void)updateSecondsRemaining {
    self.secondsRemaining = self.secondsRemaining - SECONDS_INTERVAL;

    if (self.secondsRemaining == 0) {
        [self timerFinished];
    }
}

- (void)timerFinished {
    [self reset];
}

3 个答案:

答案 0 :(得分:2)

通常,您的视图的视图控制器会实现该委托。

在.h文件中定义协议。我们说它的名字是CustomTimerDelegate。将id <CustomTimerDelegate> timerDelegate;属性添加到自定义计时器。创建自定义计时器时设置委托。该协议至少包含一个方法,每当视图控制器更新其视图时,该方法由计时器调用。视图控制器实现协议。在.h文件中,您将<CustomTimerDelegate>添加到@interface语句中。在其.m文件中,您实现了通过协议调用的方法。

这会回答你的问题吗?

答案 1 :(得分:1)

我不明白为什么你需要为此编写一个自定义计时器。

在你的TimerVC中使用它来创建一个新的计时器:

[NSTimer scheduledTimerWithTimeInterval:1.0
        target:self
        selector:@selector(timerCallback:)
        userInfo:nil
        repeats:YES];

这将每秒调用timerCallback:方法。在此方法中,您可以更新剩余时间属性,还可以更新视图。

答案 2 :(得分:1)

刚刚完成Hermann Klecker答案..请不要忘记在你的计时器课上属性应该是

@property(nonatomic, weak) id <CustomTimerDelegate> delegate

这是一个弱的属性,可以避免内存泄漏,当你的VC强烈地持有定时器并且你的定时器持有代表(在这种情况下是VC)强烈......即使VC被丢弃,它们也会被保留在内存中(因为定时器会有一个指向它的强指针)导致VC不能解除分配,因此不会使Timer解除分配,从而不会使VC解除分配...等等......

弱势你避免这个......