2013-06-10 6 views
8

Gibt es trotzdem eine versteckte Statusänderung (oder andere Änderung) in einer Unteransicht in einer UIView (nicht UIViewController) zu erkennen. Möchte das irgendwie async erkennen.IOS, UIView, Verdeckte Statusänderung in Unteransicht erkennen

Es gibt Gründe für meinen Wahnsinn.

+0

Mit „hidden Zustandswechsel“, meinen Sie eine Änderung an dem Wert des Eigenschaft "versteckt"? – herzbube

+0

Was ist mit der Beobachtung der versteckten Eigenschaft der einzelnen Unteransichten (sowie der Sammlung der Unteransichten, damit Sie wissen, wann eine Ansicht hinzugefügt/entfernt wird) mit KVO? – lnafziger

Antwort

15

Sie können KVO (Schlüsselwertbeobachtung) verwenden, um eine Änderung des Werts der Eigenschaft hidden zu erkennen.

Fügen Sie Ihren Beobachter (self in diesem Beispiel) auf folgende Weise:

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

nun die folgende Methode Ihre Beobachter-Klasse hinzufügen:

- (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 
    } 
    } 
} 

Die Beobachter-Methode aufgerufen werden, wenn die hidden Eigenschaft ändert seinen Wert. Wenn ich mich nicht irre, wird die Methode synchron im Kontext des Threads aufgerufen, der die Änderung an der Eigenschaft vornimmt. Wenn Sie eine asynchrone Benachrichtigung benötigen, können Sie diese selbst hinzufügen, zum Beispiel mit einer der Methoden NSObjectperformSelector:withObject:afterDelay: oder performSelector:onThread:withObject:waitUntilDone:.

BTW: Sie brauchen die Prüfungen in der Beobachtermethode natürlich nicht, wenn Sie nur ein einzelnes Objekt und/oder eine Eigenschaft beobachten. Ich habe die Schecks zu Illustrationszwecken aufgegeben. Ich empfehle auch, die Dokumentation von Apple auf KVO und KVC (Schlüsselwertcodierung) zu lesen, um zu verstehen, was hier vor sich geht.

Die Laufzeit wird Ihren Beobachter weiterhin glücklich benachrichtigen, auch wenn der Beobachter freigegeben wird - was zu einem Anwendungsabsturz führt! Also vergessen Sie nicht, den Beobachter zu entfernen, bevor es ausgeschaltet ist zugeteilt, spätestens sollte dies geschehen, in der Beobachter dealloc:

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

[self.deleteButton addObserver: self forKeyPath: @ "versteckte" Optionen: 0 context: nil]; wird nicht ausgelöst, wenn self.deleteButton.hidden geändert wird. – ort11

+0

Macht nichts, funktioniert gut. – ort11