Ключ-Значение-Наблюдение и NSTimer
Я пытаюсь наблюдать свойство int (totalSeconds) в классе (StopWatch), где общее количество секунд увеличивается на единицу каждый раз, когда время срабатывает (с интервалами в одну секунду). Мой пользовательский класс (DynamicLabel) подкласс UILabel должен получить сообщение наблюдаениеВалюФоркей. каждый раз, когда totalSeconds изменяется, но он никогда не вызывается. Вот соответствующий код:
#import "StopWatch.h"
@interface StopWatch ()
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation StopWatch
@synthesize timer;
@synthesize totalSeconds;
- (id)init
{
self = [super init];
if (self) {
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fireAction:) userInfo:nil repeats:YES];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];
[runLoop addTimer:timer forMode:UITrackingRunLoopMode];
}
return self;
}
- (void)fireAction:(NSTimer *)aTimer
{
totalSeconds++;
}
@end
#import "DynamicLabel.h"
@implementation DynamicLabel
@synthesize seconds;
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
seconds ++;
[self setText:[NSString stringWithFormat:@"%i",seconds]];
}
@end
и в контроллере вида:
- (void)viewDidLoad
{
[super viewDidLoad];
watch = [[StopWatch alloc] init];
[watch addObserver:dLabel1 forKeyPath:@"totalSeconds" options:NSKeyValueObservingOptionNew context:NULL];
}
где dLabel является экземпляром DynamicLabel
Кто-нибудь знает, почему это происходит? Это определенно как-то связано с NSTimer, потому что я попробовал то же самое, где я вручную изменяю значение totalSeconds, чтобы проверить, работает ли KVO, и это прекрасно работает. Тем не менее, когда totalSeconds увеличивается в методе запуска таймера, метод НаблюдатьВыберитеКейПат никогда не вызывается. Кроме того, для тех, кто интересуется, почему я использую KVO для этого, это потому, что в реальном приложении (это просто тестовое приложение) мне нужно отобразить несколько запущенных секундомеров (в разное время) на экране и записать прошедшее раз. Я хотел бы сделать это, используя одни часы. Я очень ценю любую помощь, которую могу получить.
Спасибо,
1 ответ
Наблюдение значения ключа работает только для свойств. Ваш таймер не использует ваш метод доступа к свойству для увеличения значения; он напрямую меняет ивар, который не будет генерировать никаких событий КВО. Измените это на self.totalSeconds++
и это должно работать.