La risposta da @ Rob presumibilmente ha lavorato a un certo punto, ma come @Daniel no Ted, non funziona più. Sembra che Cocoa voglia tenere traccia del mouse e trascinare una selezione in risposta a un clic, e provare a selezionare il testo in risposta a becomeFirstResponder
non funziona bene con quello.
L'evento del mouse deve essere intercettato, quindi, per impedire tale tracciamento. Più o meno per tentativi ed errori, ho trovato una soluzione che sembra funzionare su OS X 10.10:
@interface MyAutoselectTextField : NSTextField
@end
@implementation MyAutoselectTextField
- (void)mouseDown:(NSEvent *)theEvent
{
[[self currentEditor] selectAll:nil];
}
@end
Per quanto posso dire, per il momento in mouseDown:
viene chiamato l'editor campo è già stata impostata in alto, probabilmente come effetto collaterale di becomeFirstResponder
. Chiamando selectAll:
seleziona quindi il contenuto dell'editor di campo. Chiamare selectText:
su self
invece non funziona bene, presumibilmente perché l'editor di campi è impostato.Si noti che l'override di mouseDown:
qui è non chiamata super
; super
eseguirebbe un ciclo di tracciamento che trascinerebbe fuori una selezione e non vogliamo quel comportamento. Si noti che questa sovrascrittura di mouseDown:
non influisce sulla selezione una volta che il campo di testo è diventato il primo risponditore, poiché a quel punto è chiamato l'editor di campo mouseDown:
.
Non ho idea di quale gamma di versioni OS X funzioni; se ti interessa, dovrai testarlo. Sfortunatamente, lavorare con NSTextField
è sempre un po 'fragile perché il modo in cui funzionano gli editor di campi è così strano e così dipendente dai dettagli di implementazione in super
.
Grazie mille, ha funzionato in modo bello e mi ha fatto imparare un paio di cose. Ho creato il file .m dal codice che hai fornito, il file .h in questo modo: #import @interface MCTextField: NSTextField {} @end E in Interface Builder, ho andato a File -> Leggi il file di classe, selezionato il MCTextField.h, quindi ho cambiato la classe del mio campo di testo per essere MCTextField. –
Questa è anche la soluzione per un sacco di "selezionare il testo in modo programmatico" generale - le routine di selezione del testo in NSTextView, per esempio, non sparano correttamente se invocate direttamente in molte occasioni, è necessario metterle in un performSelector : afterDelay: 0 chiamata. Sigh – Adam
Questo non sembra funzionare bene in 10.9 SDK. Quando faccio clic sul campo, ottengo un segno di omissione lampeggiante a meno che non inserisca un ritardo molto lungo, ad esempio 1 secondo. –