2010-05-30 8 views
5

Ho bisogno di generare una finestra che si posizionerà sopra la finestra principale in un'applicazione di cacao. Voglio questa finestra principale per consentire all'utente di inserire del testo in una casella di input. Tutto va bene fino a quando la casella di immissione del testo non ottiene effettivamente la messa a fuoco. La finestra principale diventa "disattivata". Questa finestra è senza bordi ed è una forma leggermente personalizzata - è più simile a una carta hover di qualsiasi altra cosa, suppongo.Cocoa/Objective-C - Finestra secondaria con immissione di testo senza che la finestra principale diventi inattiva

Fondamentalmente, mi piacerebbe che questa cosa funzionasse quasi esattamente come Spotlight (Apple + Space) - puoi inserire del testo, ma questa è un'operazione così secondaria che nel contesto della UX più grande, tu non fai niente t voglio che l'effetto stridente della finestra principale si offuschi (diventando inattivo). Noterai che quando hai qualche applicazione aperta e in-focus, Spotlight non farà in modo che la finestra di quell'applicazione diventi inattiva.

Questo problema si verifica perché il testo in input sembra richiedere che la finestra secondaria diventi la finestra chiave (non consente di posizionare il cursore nel campo di immissione del testo). Quando diventa chiave, la finestra principale diventa inattiva.

Finora ho provato:

  • Subclassing NSWindow per la mia applicazione principale e prioritario isKeyWindow tale che perde tasto solo quando l'applicazione non è più gli utenti si concentrano (in contrapposizione alla finestra) è. Questo ha avuto l'effetto non intenzionale di entrare in collisione con lo stato della finestra figlio e avere effetti molto strani sull'ingresso della tastiera (alcuni tasti non vengono catturati, come eliminare)
  • Creazione di una vista anziché una finestra. Non funziona a causa del problema this: non è possibile disegnare su WebView WebView in questi giorni.

Chiunque i maghi Cocoa/OSX hanno qualche idea? Sono diventato un po 'ossessionato da questo. Un prurito che non riesco a grattare.

Modifica: ha anche provato a sovrascrivere quanto segue sulla finestra secondaria. Quando si fa clic, la finestra fa diventare la finestra principale dell'applicazione inattiva.

- (BOOL)canBecomeKeyWindow { 
    return YES; 
} 

- (BOOL)canBecomeMainWindow { 
    return NO; 
} 

Edit 2: Dopo aver avvitato circa con NSMenu per un po ', ho scartato questo approccio. Sembra che abbia trovato qualcosa, comunque. In NSPanel c'è una maschera stile finestra chiamata:

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. 

Cercando questo fuori adesso ...

Edit 3: NSNonactivatingPanelMask non ha fatto il trucco. Nessuna idea

+0

Hai mai trovato una soluzione per questo? Spiacenti, ti avrei contattato via email ma il tuo sito sembra essere inattivo. – Wesley

risposta

0

Quello che vuoi è una finestra che può diventare il key window ma che non può diventare il main window. Potresti implementare questa classe da solo, ma questo è fondamentalmente il motivo per cui è NSPanel, quindi potresti provarlo prima.

+0

Ho provato anche quello. Fammi vedere se non riesco a trovare il codice. Non riesco a ricordare se il problema era che quando eseguivo l'over-over -canBecomeMain per restituire NO, non sembrava fare alcuna differenza, o non potevo inserire il testo. – Josh

+0

Inoltre, provato NSPanel, non è così fortunato. Ancora una volta, fammi vedere se non riesco a trovare il codice.Ho dovuto eseguire il backup/scrap per la revisione del codice/check-in – Josh

+0

Dopo aver scavato il codice, ho aggiunto a quello che ho provato. Permette l'input di testo con -canBecomeMain restituendo NO, ma rende comunque semplicemente inattiva la finestra principale. È una vista del webkit nella finestra del bambino ... Mi chiedo se la webview stia ancora una volta lanciando uno stronzo nel punchbowl qui. – Josh

0

Penso che questo possa essere d'aiuto: [self.childWindow makeKeyAndOrderFront: self];

Problemi correlati