12
votes

SelectText of NstextField au focus

Quelqu'un pourrait-il suggérer une méthode pour sélectionner tout le texte d'un nstextfield lorsque l'utilisateur clique dessus?

J'ai trouvé des suggestions à la sous-classe nstextfield , puis utilisez MOUSEDOWN ou armateur , `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.


0 commentaires

5 Réponses :


24
votes

Il n'y a pas de solution plus facile, vous devez sousclure 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.

Les champs de texte peuvent être relativement complexes à la sous-classe car un 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>

comme n'importe quel NSresponder code> Sous-classe, 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


5 commentaires

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 @interface mctextfield: NStextField {} @end et in Interface Builder, je suis allé au fichier -> lire la classe Fichier, sélectionné The McTextField.h, puis j'ai changé la classe de mon champ de texte pour être MCTextField.


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.!



2
votes

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
    }
}


0 commentaires

6
votes

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 à deventefiresponder ne joue pas bien avec cela.

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: xxx

autant que je puisse dire, au moment où Mousedown: est appelé l'éditeur de terrain a déjà été configuré, probablement comme un effet secondaire de deventefiresponder . Calling Selectall: puis sélectionne le contenu de l'éditeur de champ. Calling SelectText: sur auto ne fonctionne pas bien, probablement parce que l'éditeur de champ est configuré. Notez que la substitution de Mousedown: ici ne pas appel super ; Super exécuterait une boucle de suivi qui ferait glisser une sélection et nous ne voulons pas ce comportement. Notez que ce MOUSEDOWN: 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: qui est appelé. < / p>

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 NStextfield 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 >


0 commentaires

1
votes

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
        }
    }
}


1 commentaires

Vous pouvez simplement utiliser IshatHighlight pour vérifier que



0
votes

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> xxx Pré>

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
    }
}


0 commentaires