2009-06-08 3 views
1

Ich baue eine Cocoa Desktop-Anwendung. Ich möchte wissen, wann der NSHield-Status "Verborgen" geändert wurde. Bisher hilft das Verwenden von target/action nicht, und ich kann nichts in NSNotification für diese Aufgabe finden. Ich möchte vermeiden, die setHidden-Methode zu überschreiben, weil ich dann alle NSView abgeleitete Klasse überschreiben muss, die ich verwende.Wie erhalten Sie Benachrichtigungen von NSView isHidden Änderungen?

UPDATE: Ich endete mit KVO. Der Pfad für "isHidden" ist "versteckt", wahrscheinlich weil der Setter "setHidden" ist.

Antwort

3

Sie könnten Key-Value Observing verwenden, um die isHidden Eigenschaft der NSView (s) zu beobachten. Wenn Sie eine Änderungsbenachrichtigung aus einer dieser Ansichten erhalten, können Sie überprüfen, ob sie oder eine ihrer Übersichten mit -isHiddenOrHasHiddenAncestor ausgeblendet ist.

Ein Wort der Warnung: Schlüssel-Wert zu erhalten Das Beobachten richtig ist ein wenig schwierig. Ich würde empfehlen, lesen this Beitrag von Michael Ash, oder mit der -[NSObject gtm_addObserver:forKeyPath:selector:userInfo:options] Methode aus der NSObject+KeyValueObserving Kategorie aus der .

0

Können Sie die Setter-Methode für die Eigenschaft hidden überschreiben, so dass es einige benutzerdefinierte Benachrichtigungen innerhalb Ihrer Anwendung auslösen wird?

+0

Ich vermeide diese Methode. Ich habe vergessen, dieses Detail zu meiner Frage hinzuzufügen. Danke, dass du mich erinnert hast. – phi

1

Allgemein kann man viewWillMoveToWindow: oder die anderen verwandten Methoden in NSView überschreiben, um festzustellen, wann eine Ansicht tatsächlich angezeigt wird (d. H. Ihr Fenster befindet sich in der Fensteranzeigeliste UND die Ansicht ist nicht ausgeblendet). Daher wird die Abhängigkeit von KVO für den oben verwendeten "versteckten" Schlüssel entfernt, was nur funktioniert, wenn setIsHidden für diese Ansicht aufgerufen wurde. In der Überschreibung zeigt 'window' (oder [self window]) an, ob die Ansicht in eine sichtbare Ansichtshierarchie (Fenster ist nicht-null) oder aus ihr herausgenommen wird (Fenster ist null).

Ich benutze es zum Beispiel um einen Timer zu starten/stoppen, um ein Steuerelement von Online-Daten regelmäßig zu aktualisieren - wenn ich nur aktualisieren möchte, während das Steuerelement sichtbar ist.

Verwandte Themen