2 Stimmen

MAAttachedWindow ausblenden, wenn außerhalb geklickt wird

Ich benutze eine MAAttachedWindow um ein benutzerdefiniertes Fenster unter einem NSStatusItem in der Menuleiste anzuzeigen. Alles funktioniert gut, aber ich kann keinen einfachen Weg finden, um es auszublenden, wenn der Benutzer außerhalb des Fensters klickt. Ich möchte dieses Verhalten zu implementieren, weil es ist, was der Benutzer erwartet.

Dies ist der Code, der zur Anzeige der MAAttachedWindow :

- (void)toggleAttachedWindowAtPoint:(NSPoint)pt {
    if (!self.attachedWindow) {  
        self.attachedWindow = [[MAAttachedWindow alloc] initWithView:logView
              attachedToPoint:pt 
               inWindow:nil 
                 onSide:MAPositionBottom 
                atDistance:5.0];

  [self.attachedWindow setLevel:kCGMaximumWindowLevel];
 }

 if(isVisible)
  [self.attachedWindow makeKeyAndOrderFront:self];
 else
  [self.attachedWindow orderOut];
}

Dieser Code wird ausgelöst durch eine NSStatusItem mit einer benutzerdefinierten Ansicht, die einen Klick darauf abfängt.

9voto

Carter Allen Punkte 1974

Sie sollten dies über die Delegate-Methode des Fensters tun können:

- (void)windowDidResignKey:(NSNotification *)notification

Legen Sie sich selbst als Delegierten des Fensters fest, und implementieren Sie das, um Ihre Umschaltmethode aufzurufen.

0 Stimmen

Danke, ich wusste nicht, dass es diese Methode gibt.

1voto

Shebuka Punkte 3041

Die Grundlage hierfür sind Carter Allen Antwort, aber vielleicht hilft es ja jemandem, denn ich habe einige Stunden damit verbracht, den Grund für eine EXEC_BAD_ACCESS kurz gesagt, Sie können nicht release die attachedWindow in seinem windowDidResignKey Benachrichtigung, also verwenden Sie autorelease :

- (void)windowDidResignKey:(NSNotification *)aNotification {
    NSLog(@"MainWinDelegate::windowDidResignKey: %@", [aNotification object]);

    if (fAttachedWindow && [aNotification object] == fAttachedWindow) {
        [window removeChildWindow:fAttachedWindow];
        [fAttachedWindow orderOut:self];
        [fAttachedWindow autorelease];
        fAttachedWindow = nil;
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X