◎위챗 : speedseoul
http://minsone.github.io/mac/ios/ioskey-value-coding-key-value-observing
KVC(Key-value Coding)
어플리케이션이 정보를 의미하는 문자열(또는 키)를 사용하여 간접적으로 객체의 속성값을 접근하는 매커니즘을 말합니다. Key-value coding은 key-value observing, Cocoa bindings, Core Data와 함께 작업하는 기본적인 기술입니다.
일반적인 키에 대한 값을 얻을 때 사용합니다.
- 값을 얻을 때 -
valueForKey:
- 값을 설정 할 때 -
setValue:forKey
NSLog(@"horsepower is %@", [engine valueForKey:@"horsepower"]);
[engine setValue:[NSNumber numberWithInt:150] forKey:@"horsepower"];
키-경로를 통해 속성 값을 얻을 때 사용합니다.
- 값을 얻을 때 -
valueForKeyPath:
- 값을 설정할 때 -
setValue:forKeyPath:
NSLog(@“%@“, [selectedPerson valueForKeyPath:@"spouse.scooter.modelName”] );
키에 대한 값을 배열로 얻습니다.
NSArray *pressures = [car valueForKeyPath: @"tires.pressure”];
NSLog (@"pressures %@", pressures);
원하는 키만 받을 때 사용합니다.
NSArray *keys = [NSArray arrayWithObjects:@"make", @"model",@"modelYear", nil];
NSDictionary *carValues = [cardictionaryWithValuesForKeys:keys];
NSLog(@"Car values : %@", carValues);
- (id)tableView:(NSTableView *)tableview
objectValueForTableColumn:(id)column row:(NSInteger)row {
ChildObject *child = [childrenArray objectAtIndex:row];
if ([[column identifier] isEqualToString:@"name"]) {
return [child name];
}
if ([[column identifier] isEqualToString:@"age"]) {
return [child age];
}
if ([[column identifier] isEqualToString:@"favoriteColor"]) {
return [child favoriteColor];
}
// And so on.
}
- (id)tableView:(NSTableView *)tableview
objectValueForTableColumn:(id)column row:(NSInteger)row {
ChildObject *child = [childrenArray objectAtIndex:row];
return [child valueForKey:[column identifier]];
}
모델 객체의 어떤 값이 변경되었을 경우 이를 UI에 반영하기 위해서 컨트롤러는 모델 객체에 Observing을 도입하여 델리게이트에 특정 메시지를 보내 처리할 수 있도록 하는 것입니다.
- (void)registerAsObserver {
/*
Register 'inspector' to receive change notifications for the "openingBalance" property of
the 'account' object and specify that both the old and new values of "openingBalance"
should be provided in the observe… method.
*/
[account addObserver:inspector
forKeyPath:@"openingBalance"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:NULL];
}
NSKeyValueObservingOptioinNew는 NSKeyValueChangeNewKey 키에 대한 새 값을 저장합니다. NSKeyValueObservingOptionOld는 NSKeyValueChangeOldKey 키에 대한 이전 값을 저장합니다.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"openingBalance"]) {
[openingBalanceInspectorField setObjectValue:
[change objectForKey:NSKeyValueChangeNewKey]];
}
/*
Be sure to call the superclass's implementation *if it implements it*.
NSObject does not implement the method.
*/
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
- (void)unregisterForChangeNotification {
[observedObject removeObserver:inspector forKeyPath:@"openingBalance"];
}