2013-06-10 17 views
8

UIView(UIViewControllerではなく)のサブビューで隠された状態の変化(または他の変化)を検出することはできますか?何とかこの非同期を検出したいと思います。IOS、UIView、サブビューの隠し状態の変化を検出する

私の狂気の理由があります。

+0

、あなたがの値が変更されたことを意味しています。だから、遅くとも、これは観察者のdeallocに起こるべき、割り当て解除される前にオブザーバを削除することを忘れないでくださいプロパティ 'hidden'? – 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:のいずれかを使用して、自分自身で追加できます。

ところで、オブザーバーメソッドではチェックは必要ありません。単一のオブジェクトやプロパティだけを観察する場合は、明らかです。私は説明のために小切手を残しました。また、AppleのドキュメントKVOKVC(キーバリューコーディング)を読んで、ここで何が起こっているのかを理解することをお勧めします。

オブザーバの割り当てが解除されても、オブザーバに通知が送信され続け、アプリケーションがクラッシュする可能性があります。 「隠された状態変化」で

- (void) dealloc 
{ 
    UIView* viewToObserve = [self getViewToObserve]; 
    [viewToObserve removeObserver:self forKeyPath:@"hidden"]; 
    [super dealloc]; 
} 
+0

[self.deleteButton addObserver:self forKeyPath:@ "hidden"オプション:0コンテキスト:nil]; self.deleteButton.hiddenが変更されたときに起動しません。 – ort11

+0

気にしないで、うまく動作します。 – ort11

関連する問題