2013-06-10 4 views
8

UIView (UIViewController 아님)의 하위보기에서 숨겨진 상태 변경 (또는 다른 변경)을 감지 할 수 있습니까? 이 비동기를 어떻게 든 감지하고 싶습니다.IOS, UIView, Subview의 숨겨진 상태 변경 감지

내 광기에는 이유가 있습니다.

+0

, 당신은의 값의 변경을 의미합니까 속성'숨겨진'? – herzbube

+0

KVO를 사용하여 각 하위 뷰 (하위 뷰 컬렉션뿐만 아니라 뷰가 추가/제거 된 시점을 알 수 있음)의 숨겨진 속성을 관찰하면 어떨까요? – lnafziger

답변

15

KVO (키 값 관측)를 사용하여 hidden 속성의 값 변경을 감지 할 수 있습니다.

다음과 같은 방법으로 관찰자 (이 예에서는 self)을 추가

UIView* viewToObserve = [self getViewToObserve]; // implement getViewToObserve 
[viewToObserve addObserver:self forKeyPath:@"hidden" options:0 context:NULL]; 

은 이제 관찰자 클래스에 다음 메서드를 추가 관찰자 메소드가 호출됩니다

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context 
{ 
    UIView* viewToObserve = [self getViewToObserve]; 
    if (object == viewToObserve) 
    { 
    if ([keyPath isEqualToString:@"hidden"]) 
    { 
     // react to state change 
    } 
    } 
} 

때마다 hidden 속성이 값을 변경합니다. 내가 잘못 본 것이 아니라면, 메소드는 속성을 변경시키는 스레드 컨텍스트에서 동 기적으로 호출됩니다. 비동기 알림이 필요한 경우에는 NSObject 메서드 performSelector:withObject:afterDelay: 또는 performSelector:onThread:withObject:waitUntilDone: 중 하나를 사용하여 직접 추가 할 수 있습니다.

BTW : 관찰자 방법에서는 수표가 필요하지 않습니다. 단 하나의 물체 및/또는 속성 만 관찰하면 분명합니다. 나는 그림을 목적으로 수표를 남겼다. 또한 Apple의 설명서를 KVOKVC (키 값 코딩)으로 읽으면서 여기에서 진행되는 작업을 이해하는 것이 좋습니다.

관찰자의 할당이 해제 되어도 런타임은 계속 관찰자에게 알려주므로 행복합니다. 이 할당 해제되기 전에 그래서 관찰자를 제거하는 것을 잊지 마세요, 늦어도이 일어날해야 관찰자의 dealloc :

- (void) dealloc 
{ 
    UIView* viewToObserve = [self getViewToObserve]; 
    [viewToObserve removeObserver:self forKeyPath:@"hidden"]; 
    [super dealloc]; 
} 
"숨겨진 상태 변경"으로
+0

[self.deleteButton addObserver : self forKeyPath : @ "숨김"옵션 : 0 컨텍스트 : nil]; self.deleteButton.hidden이 변경되면 실행되지 않습니다. – ort11

+0

괜찮습니다. 괜찮습니다. – ort11