2010-05-30 10 views
5

Ich brauche ein Fenster, das in einer Kakaoanwendung über meinem Hauptfenster schwebt. Ich möchte, dass dieses Hauptfenster dem Benutzer erlaubt, etwas Text in ein Eingabefeld einzugeben. Alles ist gut, bis das Texteingabefeld tatsächlich den Fokus erhält. Das Hauptfenster wird "deaktiviert". Dieses Fenster ist grenzenlos und hat eine leicht benutzerdefinierte Form - es ist mehr wie eine Hover-Karte als alles andere, nehme ich an.Cocoa/Objective-C - Unterfenster mit Texteingabe ohne Hauptfenster wird inaktiv

Grundsätzlich möchte ich diese Sache fast genau wie Spotlight (Apple + Space) arbeiten - Sie können Text eingeben, aber das ist so eine Nebenoperation, die Sie im Kontext der größeren UX nicht tun Ich möchte, dass der Erschütterungseffekt des Hauptfensters grau wird (inaktiv wird). Sie werden bemerken, wenn eine Anwendung offen und fokussiert ist, wird Spotlight nicht dazu führen, dass das Fenster dieser Anwendung inaktiv wird.

Dieses Problem tritt auf, weil Texteingabe erfordert, dass das untergeordnete Fenster das Schlüsselfenster wird (es wird nicht zulassen, dass Sie den Cursor in dem Texteingabefeld platzieren). Wenn es der Schlüssel wird, wird das Hauptfenster inaktiv.

Bisher habe ich versucht:

  • Subclassing NSWindow für meine Hauptanwendung und überwiegenden isKeyWindow, so dass es nur Schlüssel verliert, wenn die Anwendung nicht mehr die Benutzer konzentrieren (wie zum Fenster gegen). Dies hatte den unbeabsichtigten Effekt, mit dem Schlüsselstatus des untergeordneten Fensters zu kollidieren und sehr seltsame Auswirkungen auf die Tastatureingabe zu haben (einige Schlüssel werden nicht erfasst, wie zum Beispiel Löschen)
  • Erstellen einer Ansicht anstelle eines Fensters. Funktioniert nicht wegen this Problem - Sie können in diesen Tagen nicht über ein Webkit WebView zeichnen.

Haben alle Cocoa/OSX-Assistenten irgendwelche Ideen? Ich bin ein bisschen besessen von diesem. Ein Jucken kann ich nicht kratzen.

Edit: habe auch versucht, über das untergeordnete Fenster zu überschreiben. Wenn Sie auf das Fenster klicken, wird das Hauptanwendungsfenster inaktiv.

- (BOOL)canBecomeKeyWindow { 
    return YES; 
} 

- (BOOL)canBecomeMainWindow { 
    return NO; 
} 

Edit 2: Nach Aufschrauben etwa mit NSMenu für eine Weile, verschrottet ich diesen Ansatz. Es scheint aber, dass ich etwas gefunden habe. In NSPanel gibt es eine Maske Fensterstil genannt:

NSNonactivatingPanelMask 
The panel can receive keyboard input without activating the owning application. 
Valid only for an instance of NSPanel or its subclasses; not valid for a window. 

diesen Versuch nun aus ...

Bearbeiten 3: NSNonactivatingPanelMask hat nicht den Trick. Keine Ideen.

+0

Haben Sie jemals eine Lösung dafür gefunden? Entschuldigung, ich hätte Sie per E-Mail kontaktiert, aber Ihre Website scheint nicht erreichbar zu sein. – Wesley

Antwort

0

Was Sie wollen, ist ein Fenster, das die key window werden kann, die aber nicht die main window werden kann. Sie könnten eine solche Klasse selbst implementieren, aber dafür ist NSPanel genau das Richtige, also versuchen Sie es zuerst.

+0

Versucht, dass auch. Lass mich sehen, ob ich den Code nicht ausgraben kann. Ich kann mich nicht erinnern, ob das Problem war, dass, wenn ich überredete, CanComeMain, um NEIN zurückzugeben, schien es überhaupt keinen Unterschied zu machen, oder ich konnte keinen Text eingeben. – Josh

+0

Auch, versuchte NSPanel, kein solches Glück. Lass mich mal sehen, ob ich den Code nicht ausgraben kann.Musste es sichern/für Code-Review/Check-in verschrotten – Josh

+0

Nach dem Ausgraben des Codes, habe ich hinzugefügt, was ich versucht habe. Es ermöglicht die Texteingabe mit -canBecomeMain, die NEIN zurückgibt, aber es macht das Hauptfenster immer noch inaktiv. Es ist eine Webkit-Ansicht im Child-Fenster ... Ich frage mich, ob Webview hier noch einmal einen Scheißhaufen in die Bowle wirft. – Josh

0

Ich denke, das kann Ihnen helfen: [self.childWindow makeKeyAndOrderFront: self];

Verwandte Themen