2017-01-27 64 views
0

我正在嘗試實現Key Value Observation模式,並且在大多數流程中運行良好,但即使值已從舊值更改爲新值,我的newValue和oldValue也是相同的。以下是我迄今爲止實施的示例代碼。如果有人能告訴我我的錯在哪裏,那將會很棒。實施Keyvalue Observation with issues

@property (strong, nonatomic) NSString* selectedRow; 

添加觀察

[self addObserver:self 
      forKeyPath:@"selectedRow" 
       options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew 
       context:NULL]; 

方法,其中的值將被更新

-(void) methodToChangeValue { 
self.selectedRow = [self.tableView indexPathForCell:[selectedCell]]; 
//Above line is dummy that will get the row for indexPath and set the selected row, I wanted to pass that row to selectRow key 

} 

觀察員發言

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

    NSString* oldValue = [change valueForKey:NSKeyValueChangeOldKey]; 
    NSString *newValue = [change valueForKey:NSKeyValueChangeNewKey]; 

    NSLog(@" old value %@ and new value %@", oldValue,newValue); 
} 

**舊的價值和新的價值,即使我一樣改變了 來自該方法的價值。

感謝

回答

1

你的問題是這些線路:

_selectedRow = [self.tableView indexPathForCell:[selectedCell]]; 
[self setValue:_selectedRow forKey:@"selectedRow"]; 

你爲什麼要這麼做?爲什麼不這樣做:

self.selectedRow = [self.tableView indexPathForCell:[selectedCell]]; 

如果你這樣做,KVO將正常工作。就像你現在所做的那樣,你直接設置實例變量(繞過KVO),然後使用KVC將屬性設置爲與它自己的實例變量相同的值。由於您將屬性設置爲自己的值,因此觀察者將舊值和新值視爲相同。

您還正在使用錯誤的數據類型爲selectedRow。它需要是NSIndexPath而不是NSString。獲得新舊價值觀也是一樣。使用NSIndexPath

+0

我已經根據用戶選擇tableViewcell設置_selectedRow,並希望獲取行的舊值和新值。我不完全確定,我在那裏做了什麼是錯的。 – RoshUn

+0

用'self.selectedRow = [self.tableView indexPathForCell:[selectedCell]];'替換'methodToChangeValue'中的代碼。這將觸發KVO並給你新的和新的價值。 – rmaddy

+0

謝謝@rmaddy。我仍然無法獲得oldValue,即使我更改了行,它仍然返回null作爲oldValue,新值具有舊值null和新值3. – RoshUn