13

UIView(UIViewControllerではなく)のサブビューで非表示の状態の変更(またはその他の変更)を検出する方法はありますか。この非同期を何らかの形で検出したいと思います。

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

4

2 に答える 2

20

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プロパティの値が変更されるたびに、observer メソッドが呼び出されます。私が間違っていなければ、メソッドは、プロパティを変更するスレッドのコンテキストで同期的に呼び出されます。非同期通知が必要な場合は、たとえばNSObjectメソッドperformSelector:withObject:afterDelay:またはのいずれかを使用して、自分で追加できますperformSelector:onThread:withObject:waitUntilDone:

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

オブザーバーの割り当てが解除されても、ランタイムは喜んでオブザーバーに通知し続けます。その結果、アプリケーションがクラッシュします! したがって、オブザーバーの割り当てを解除する前に、オブザーバーを削除することを忘れないでください。遅くとも、これはオブザーバーのdealloc:

- (void) dealloc
{
    UIView* viewToObserve = [self getViewToObserve];
    [viewToObserve removeObserver:self forKeyPath:@"hidden"];
    [super dealloc];
}
于 2013-06-10T22:30:17.187 に答える