KVO 는 한 객체가 다른 객체의 속성 변화를 감시하고자 할 때 사용할 수 있는 아주 편리한 매커니즘이다. A라는 객체의 name이라는 속성이 있다고 가정하고 이 속성값이 변하는 때를 알고 싶다면 단순히 name 속성에 옵저버를 설정하면 된다. 물론 한 속성에 여러 옵저버를 설정하는 것도 가능하다.
하지만 문제는 UISlider 객체처럼 연속으로 변경하는 value값을 감시하기에는 아직 아이폰의 KVO가 완벽하지 않은 것 같다.
연속으로 변하는 value값의 감시가 연속으로 전달되는 것이 아니라 UISlider의 코를 놓았을 때 감시가 되기 때문이다.
하지만 이런 경우는 UISlider의 target/action으로 연속으로 변하는 값을 감시할 수 있다.
아래는 예제의 핵심코드로 UISlider의 value 속성에 옵저버를 설정하는 것과 UISlider의 value속성이 변경되었을 때 UILabel 에 해당 값을 적어주는 코드이다.
하지만 문제는 UISlider 객체처럼 연속으로 변경하는 value값을 감시하기에는 아직 아이폰의 KVO가 완벽하지 않은 것 같다.
연속으로 변하는 value값의 감시가 연속으로 전달되는 것이 아니라 UISlider의 코를 놓았을 때 감시가 되기 때문이다.
하지만 이런 경우는 UISlider의 target/action으로 연속으로 변하는 값을 감시할 수 있다.
아래는 예제의 핵심코드로 UISlider의 value 속성에 옵저버를 설정하는 것과 UISlider의 value속성이 변경되었을 때 UILabel 에 해당 값을 적어주는 코드이다.
- (void)viewDidLoadUITableView에 KVO를 적용하여 테이블행의 추가와 삭제를 멋지게 구현한 예제는 http://iphonedevelopment.blogspot.com/2009/11/using-kvo-for-table-updates.html 글에서 읽을 수 있다.
{
[super viewDidLoad];
self.value = [[[UILabel alloc] initWithFrame:CGRectMake(100, 50, 100, 30)] autorelease];
[self.view addSubview:self.value];
self.slider = [[[UISlider alloc] initWithFrame:CGRectMake(100, 100, 100, 30)] autorelease];
self.slider.continuous = YES;
self.slider.minimumValue = 0.0;
self.slider.maximumValue = 100.0;
[self.view addSubview:self.slider];
[self.slider addObserver:self forKeyPath:@"value" options:0 context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if(self.slider == object)
{
self.value.text = [NSString stringWithFormat:@"%f", self.slider.value];
}
}
'iOS개발팁' 카테고리의 다른 글
Previous frame inner to this frame (0) | 2011.03.29 |
---|---|
XCode에 커스텀 텍스트 매크로를 추가하자. (0) | 2011.03.17 |
Failed to upload iPhoneAppName.app (0) | 2010.11.25 |
Media Layer 소개 (0) | 2010.11.19 |
Core Sevices Layer 소개 (0) | 2010.11.19 |