我想觀察一個類(秒錶)中的一個int屬性(秒),其中總秒數每增加一次時間激發(一秒間隔)我的自定義類(DynamicLabel )每次totalSeconds發生變化時,UILabel的子類應該會收到一個observeValueForKeyPath消息,但它永遠不會被調用。下面是相關代碼:鍵值觀察和NSTimer
#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在計時器的fire方法中增加時,observeValueForKeyPath方法永遠不會被調用。此外,對於那些想知道爲什麼我爲此使用KVO的人,這是因爲在真實應用程序中(這只是一個測試應用程序),我需要在屏幕上顯示多個正在運行的秒錶(並在不同的時間)並記錄所用時間倍。我想用一個時鐘做這個。我非常感謝我能得到的任何幫助。
謝謝,
非常感謝!多麼愚蠢的疏忽。 – 2012-02-20 01:26:18
比大腦癱瘓,深種子蟲或邏輯錯誤更好的監督。 :) – LucasTizma 2012-02-20 01:29:02