2011-09-26 2 views
33

Quando si fa clic su un pulsante, mi piacerebbe visualizzare un foglio con una richiesta e-mail + password con opzioni per salvare e annullare. L'interfaccia utente è stata configurata, le azioni sono state eseguite e il foglio viene visualizzato e annulla come previsto. Il problema è che non posso modificare nessuno dei NSTextField in fase di runtime; sembrano disabilitati e il suono dell'errore del sistema operativo viene riprodotto a ogni pressione di un tasto quando il foglio è aperto. Ho letto su SO che lo UIActionSheet è appropriato, ma questa non è un'app per iOS.non è possibile modificare NSTextField nel foglio al runtime

I campi di testo sono abilitati e in precedenza avevano funzionato in un altro pannello. Mi sono assicurato che i collegamenti IBAction fossero intatti, ma non sono nemmeno sicuro di come risolvere il problema.

Cosa dire di un foglio causerebbe un NSTextField altrimenti sano per rifiutare l'input?

// show the sheet 
-(IBAction)showAccount:(id)sender { 
    [NSApp beginSheet:accountWindow 
     modalForWindow:prefsWindow 
     modalDelegate:self 
     didEndSelector:NULL 
      contextInfo:NULL]; 
} 

// cancel/hide the sheet 
-(IBAction)cancelAccount:(id)sender { 
    [NSApp endSheet:accountWindow]; 
    [accountWindow orderOut:nil]; 
} 

Edit: ho appena scoperto che posso fare clic destro e incollare il testo in ogni campo, ma non riesco a selezionare o eliminare. Sembra che gli NSTextField non ottengano lo stato attivo e non ricevano input da tastiera come in genere farebbero. Ho anche dimenticato di menzionare che il mio pulsante Salva chiama ed esegue correttamente il suo metodo correlato.

risposta

35

La vista non deve assolutamente avere una barra del titolo.

Vedi Why NSWindow without styleMask:NSTitledWindowMask can not be keyWindow?

in cui si afferma: Se si desidera una finestra titleless per essere in grado di diventare una finestra chiave, è necessario creare una sottoclasse di NSWindow e sovrascrivere -canBecomeKeyWindow come segue:

- (BOOL)canBecomeKeyWindow { 
    return YES; 
} 

Questo ha funzionato per me.

+0

Questo ha funzionato per me, e reso più facile non ha dovuto ricodificare a causa di una barra del titolo. – evilgoldfish

+1

Questa è la risposta migliore.Non so perché hanno reso questo comportamento predefinito per Windows senza titolo e non controllabile tramite delegato, ma ho usato una sottoclasse con questo metodo e le cose hanno funzionato bene. –

+0

Questo * può * essere reso predefinito nell'applicazione tramite una categoria. Vedi [questa risposta] (http://stackoverflow.com/questions/7214273/nstextfield-on-nspopover) – cbedrosian

79

Si scopre che ho trovato la soluzione a casaccio, che io ora inviare per i posteri ...

Il punto di vista che viene utilizzata come foglio (o NSWindow NSPanel) deve avere una barra del titolo. Non appena ho attivato la finestra di dialogo dell'Inspector Builder (finestra → Aspetto → barra del titolo), l'ho ricompilata e gli NSTextField hanno evidenziato, catalogato e accettato input come in qualsiasi altra vista. Non sei sicuro del motivo per cui la barra del titolo fa la differenza, ma ce l'hai.

+0

Grazie mille per questa risposta, ho avuto lo stesso identico problema tranne che con un NSTokenField. Ho provato a riscrivere tutto, rifare tutto in IB e finalmente ho scoperto che la barra del titolo era il problema. Vorrei che questo problema fosse meglio documentato. –

+0

Anche io ho riscontrato questo problema! Stavo cercando di usare una finestra trasparente invisibile per fare le sovrapposizioni dello schermo con i campi di testo ... A mio dispiacere i campi di testo non accettavano input ... Questo spiega perché! Grazie mille! –

+0

Ho riscontrato un problema simile a quello in cui l'NSButton predefinito sul foglio non era a impulsi. Questo l'ha risolto. – Mahouk