본문 바로가기

iOS개발팁

UISlider 와 KVO

KVO 는 한 객체가 다른 객체의 속성 변화를 감시하고자 할 때 사용할 수 있는 아주 편리한 매커니즘이다. A라는 객체의 name이라는 속성이 있다고 가정하고 이 속성값이 변하는 때를 알고 싶다면 단순히 name 속성에 옵저버를 설정하면 된다. 물론 한 속성에 여러 옵저버를 설정하는 것도 가능하다.

하지만 문제는 UISlider 객체처럼 연속으로 변경하는 value값을 감시하기에는 아직 아이폰의 KVO가 완벽하지 않은 것 같다.

연속으로 변하는 value값의 감시가 연속으로 전달되는 것이 아니라 UISlider의 코를 놓았을 때 감시가 되기 때문이다.

하지만 이런 경우는 UISlider의 target/action으로 연속으로 변하는 값을 감시할 수 있다.

아래는 예제의 핵심코드로 UISlider의 value 속성에 옵저버를 설정하는 것과 UISlider의 value속성이 변경되었을 때 UILabel 에 해당 값을 적어주는 코드이다.

- (void)viewDidLoad
{
    [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];
    }
}
UITableView에 KVO를 적용하여 테이블행의 추가와 삭제를 멋지게 구현한 예제는 http://iphonedevelopment.blogspot.com/2009/11/using-kvo-for-table-updates.html 글에서 읽을 수 있다.


'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