0

我:目標C志願,新的NSLog +舊值

- (void) observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(Player *)object 
         change:(NSDictionary<NSString *,id> *)change 
         context:(void *)context 
{ 
    switch (object.Status) 
    { 
     case 0: 
      NSLog(@"%ld Play" ,object.Status); 
      break; 
     case 1: 
      NSLog(@"%ld Pause", object.Status); 
      break; 
     case 2: 
      NSLog(@"%ld Stop", object.Status); 
      break; 
     case 3: 
      NSLog(@"%ld RewindF", object.Status); 
      break; 
     case 4: 
      NSLog(@"%ld RewindB", object.Status); 
      break; 
     default: 
      break; 
    } 
} 

和:

[player addObserver:classA 
     forKeyPath:@"Status" 
      options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
      context:nil]; 

我想在屏幕上看到的2個值: NewValueKeyOldValueKey,但我也不怎麼也NSLog OldValue。 我試着做某事是

NSString *oldValue = [change objectForKey:NSKeyValueObservingOptionNew]; 

但我得到錯誤

「NSUInteger太字符串」

如何連接於一體的NSLog新老:)?

回答

-1

好吧,如果你特別想只要登錄你的,你需要輸入扮演他們的新老status--(因爲你接納他們爲NSNumber

像這樣:

NSLog(@"OLD VALUE: %@ \nNEW VALUE: %@", [[change objectForKey:NSKeyValueChangeOldKey] stringValue], [[change objectForKey:NSKeyValueChangeNewKey] stringValue]); 

還要注意您要使用常數,例如NSKeyValueChangeNewKey。不是選項不變,e.g NSKeyValueObservingOptionNew

編輯:@Joost已經糾正了我,-objectForKey返回NSNumber。因此,要獲得一個字符串記錄,您需要發送該對象-stringValue消息

+0

您還應該檢查keyPath以確保'change'字典包含您認爲它的作用。例如,如果你有這個對象觀察一個單獨的對象 - 並且KVO通知被髮送,那麼這裏的'NSLog'可以拋出一個異常,如果變化字典中的值不能被轉換成'long' –

+0

你的**注**實際上是這裏的問題,而不是鑄造。實際上,由於'objectForKey:'返回一個對象,所以你建議的投射不正確,因此投射到'long'是不正確的。 – Joost

+0

對不起,你是對的。腦屁。讀他的「錯誤」,它把我扔了 –