2017-01-27 5 views
0

Key Value Observationパターンを実装しようとしていますが、ほとんどのプロセスでうまくいきましたが、newValueとoldValueは値が古い値から新しい値に変更されても同じです。これまでに実装したサンプルコードを示します。誰かが私にこのことが間違っていることを教えてもらえるといいですね。KeyValue実装で問題が発生する

@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); 
} 

**古い値と新しい値がさえIかかわらず同じです変更されたメソッドの値。

おかげ

答えて

1

あなたの問題は、これらの線です:

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

は、なぜあなたはこれをやっていますか?なぜそれは適切な方法ではありませんか:

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

このようにすれば、KVOは正常に動作します。今のように、インスタンス変数を直接設定しています(KVOをバイパスしています)。次にKVCを使用して、プロパティを独自のインスタンス変数と同じ値に設定します。プロパティーを独自の値に設定しているため、オブザーバーは古い値と新しい値を同じものと見なします。

また、selectedRowに間違ったデータ型を使用しています。 NSStringの代わりにNSIndexPathにする必要があります。古い値と新しい値を取得する場合と同じです。 NSIndexPathを使用してください。

+0

私は、tableViewcellを選択したユーザーに基づいて_selectedRowを設定し、行の古い値と新しい値を取得したいとします。私は間違っていることを私がそこで行ったことは確かではありません。 – RoshUn

+0

'methodToChangeValue'のコードを' self.selectedRow = [self.tableView indexPathForCell:[selectedCell]]; 'に置き換えてください。それはKVOを誘発し、あなたに古いものと新しい価値を与えます。 – rmaddy

+0

ありがとう@rmaddy。私はまだoldValueを取得することができません、私は行を変更してもoldValueのnullを返している、新しい値は古い値nullと新しい値3を持っています。 – RoshUn

関連する問題