Quelqu'un pourrait-il suggérer une méthode pour sélectionner tout le texte d'un J'ai trouvé des suggestions à la sous-classe nstextfield code> lorsque l'utilisateur clique dessus? p>
nstextfield code>, puis utilisez
MOUSEDOWN code> ou
armateur code>, `mais c'est au-delà de mes compétences pour l'instant. J'espérais donc soit qu'il y aurait une solution plus facile ou que quelqu'un pourrait être assez gentil de manière à détailler les étapes requises. P>
5 Réponses :
Il n'y a pas de solution plus facile, vous devez sousclure Les champs de texte peuvent être relativement complexes à la sous-classe car un comme n'importe quel NSresponder code> Sous-classe, nstextfield code> pour faire ce que vous voulez. Vous devrez apprendre à gérer la sous-classement si vous devez faire quelque chose d'utile dans le cacao.
NStextField code> utilise un
distinct NStextView code > Objet appelé l'éditeur de terrain pour gérer l'édition réelle. Cette vue texte est renvoyée par l'objet
nswindow code> pour le
nstextfield code> et il est réutilisé pour tous les champs de texte de la page. P>
NStextField CODE> répond aux méthodes
-AcceptsFirStreponder code> et
-BecomefirStretre code>. Celles-ci sont appelées lorsque la fenêtre veut se concentrer sur un contrôle ou une vue particulière. Si vous retournez
Oui code> à partir de ces méthodes, votre contrôle / View aura le premier statut de répondeur, ce qui signifie que c'est le contrôle actif. Toutefois, comme mentionné, un nstextfield donne en réalité l'état de l'éditeur de champ Editeur d'un premier répondeur lorsque vous avez cliqué, de sorte que vous devez faire quelque chose comme celui-ci dans votre
NStextField code> Sous-classe: P>
@implementation MCTextField
- (BOOL)becomeFirstResponder
{
BOOL result = [super becomeFirstResponder];
if(result)
[self performSelector:@selector(selectText:) withObject:self afterDelay:0];
return result;
}
@end
Merci beaucoup, ça a fonctionné magnifiquement et m'a fait apprendre quelques choses. J'ai créé le fichier .m du code que vous avez fourni, le fichier .h comme: #import
Ceci est également la solution pour beaucoup de généralistes "Sélectionnez le texte de manière programmatique" - les routines de sélection de texte dans NStextView, par exemple, ne tirent pas correctement si elles sont invoquées directement à beaucoup d'occasions, vous devez les mettre dans un spectacleSelector: AfterDelay: 0 appel. Soupir
Cela ne semble pas bien fonctionner dans 10.9 SDK. Lorsque je clique sur le champ, je reçois un caréseau clignotant à moins que je ne pose un très long retard, comme 1 seconde.
Comme @Danielwabyick a noté, cette solution ne fonctionne plus. Je viens de poster une nouvelle réponse qui semble fonctionner sur le système d'exploitation X 10.10. Cette réponse obsolète devrait probablement être supprimée.
J'étais très curieux pourquoi de toutes les manières suivantes ne fonctionnent pas. [Self SelectText: auto]; [Auto-performalector: @Selector (SelectText :) withObject: auto]; [SelfacsSelectorOntoronMainteDead: @Selector (SelectText :) withObject: auto serveuse: Non]; mais seulement "[SelfsSelector: @Selector (SelectText :) withObject: auto-après-atelier: 0];" travailler. Mais vous avez expliqué pourquoi! Merci beaucoup! J'ai envie de trouver du trésor.!
Quelques mises à jour avec SWIFT:
import Cocoa class TextFieldSubclass: NSTextField { override func becomeFirstResponder() -> Bool { let source = CGEventSourceCreate(CGEventSourceStateID.HIDSystemState) let tapLocation = CGEventTapLocation.CGHIDEventTap let cmdA = CGEventCreateKeyboardEvent(source, 0x00, true) CGEventSetFlags(cmdA, CGEventFlags.MaskCommand) CGEventPost(tapLocation, cmdA) return true } }
La réponse de @ROB a vraisemblablement travaillé à un moment donné, mais comme @daniel notait, cela ne fonctionne plus. Il semble que le cacao veuille suivre la souris et faire glisser une sélection en réponse à un clic et essayer de sélectionner le texte en réponse à L'événement de la souris doit ensuite être intercepté pour éviter ce suivi. Plus ou moins par essai et erreurs, j'ai trouvé une solution qui semble fonctionner sur OS X 10.10: p> autant que je puisse dire, au moment où Je n'ai aucune idée de la gamme de versions OS X que cela fonctionne à travers; Si vous vous souciez, vous devrez le tester. Malheureusement, travailler avec deventefiresponder code> ne joue pas bien avec cela.
Mousedown: code> est appelé l'éditeur de terrain a déjà été configuré, probablement comme un effet secondaire de
deventefiresponder code>. Calling
Selectall: code> puis sélectionne le contenu de l'éditeur de champ. Calling
SelectText: code> sur
auto code> ne fonctionne pas bien, probablement parce que l'éditeur de champ est configuré. Notez que la substitution de
Mousedown: code> ici ne pas em> appel
super code>;
Super code> exécuterait une boucle de suivi qui ferait glisser une sélection et nous ne voulons pas ce comportement. Notez que ce
MOUSEDOWN: CODE> Nurside n'affecte pas la sélection une fois que le Textfield est devenu le premier répondeur, car à ce moment-là, c'est le
MouseDown du terrain: code> qui est appelé. < / p>
NStextfield code> est toujours un peu fragile car la façon dont les éditeurs de champ fonctionnent sont si étranges et dépendent ainsi des détails de la mise en œuvre dans
Super p> p> P> P> >
J'aime la solution de Konstantin, mais celle-ci sélectionnera sur chaque souris vers le bas. Voici une variante que j'utilise pour sélectionner dans MouseDown Code> Méthode, mais uniquement s'il est devenu le premier répondeur:
class SelectingTextField: NSTextField {
var wantsSelectAll = false
override func becomeFirstResponder() -> Bool {
wantsSelectAll = true
return super.becomeFirstResponder()
}
override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
if wantsSelectAll {
selectText(self)
wantsSelectAll = false
}
}
}
Vous pouvez simplement utiliser IshatHighlight pour vérifier que
Je sais que c'est une vieille question, mais voici une mise à jour de ceux qui pourraient trébucher à ce sujet.
remplacer NStextfield et accrocher à DevenFirSpenter (). Vous n'aurez pas à vous soucier de la gestion des délégués ou des clics. La partie délicate consiste à trouver l'éditeur de terrain pour le champ de texte ciblé avant de le demander de sélectionner tout le texte. P>
objectif-c strong> p> Swift STRAND> P> class AutoselectOnFocusTextField: NSTextField {
override func becomeFirstResponder() -> Bool {
guard super.becomeFirstResponder() else {
return false
}
if let editor = self.currentEditor() {
editor.perform(#selector(selectAll(_:)), with: self, afterDelay: 0)
}
return true
}
}