2012-02-20 86 views
4

我想觀察一個類(秒錶)中的一個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的人,這是因爲在真實應用程序中(這只是一個測試應用程序),我需要在屏幕上顯示多個正在運行的秒錶(並在不同的時間)並記錄所用時間倍。我想用一個時鐘做這個。我非常感謝我能得到的任何幫助。

謝謝,

回答

4

鍵值觀測僅適用於屬性。您的計時器不使用您的屬性訪問器來增加值;它直接改變伊娃,這不會產生任何KVO事件。將其更改爲self.totalSeconds++,它應該可以工作。

+0

非常感謝!多麼愚蠢的疏忽。 – 2012-02-20 01:26:18

+2

比大腦癱瘓,深種子蟲或邏輯錯誤更好的監督。 :) – LucasTizma 2012-02-20 01:29:02