0

我正在构建一个带有计时器的应用程序,并且我创建了一个自定义类 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];
}
4

3 回答 3

2

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

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

这是否回答你的问题?

于 2013-08-16T16:09:26.613 回答
1

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

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

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

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

于 2013-08-16T16:12:21.760 回答
1

刚刚完成 Hermann Klecker 的回答..请不要忘记,在你的计时器类中,属性应该是

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

这是..当您的 VC 强烈持有计时器并且您的计时器强烈持有委托(在本例中为 VC)时避免内存泄漏的弱属性......即使 VC 被转储,它们也会保留在内存中(因为计时器将有一个指向它的强指针)导致 VC 不释放,因此不会使 Timer 释放,因此不会使 VC 释放......等等......

虚弱的你避免这个......

于 2013-08-16T16:21:09.980 回答