我正在构建一个带有计时器的应用程序,我已经创建了一个自定义类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];
}
答案 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解除分配...等等......
弱势你避免这个......