Ключ-Значение-Наблюдение и 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++и это должно работать.

Другие вопросы по тегам