NSTextField et "Drag & Drop"
tablier
Membre
J'ai un textField que je veux pouvoir éditer, mais je ne veux pas que ce textfield accepte le "drag & drop".
Dans IB, je rends bien le textField editable mais cela autorise le "drag & drop".
L'héritage de NSTextField est NSControl : NSView : NSResponder : NSObject
L'interface utilisateur d'un NSTextField est gérée par un NSTextFieldCell dont l'héritage est NSActionCell : NSCell : NSObject.
La seule méthode que je trouve pour invalider le " drag & drop" est (dans NSView):
- (void)unregisterDraggedTypes
Mais, ça n'invalide rien du tout. Si le textField est editable, il accepte d'office le "drag & drop".
Quelle est la bonne solution pour qu'un textField soit editable et refuse le "drag & drop" ?
Dans IB, je rends bien le textField editable mais cela autorise le "drag & drop".
L'héritage de NSTextField est NSControl : NSView : NSResponder : NSObject
L'interface utilisateur d'un NSTextField est gérée par un NSTextFieldCell dont l'héritage est NSActionCell : NSCell : NSObject.
La seule méthode que je trouve pour invalider le " drag & drop" est (dans NSView):
- (void)unregisterDraggedTypes
Mais, ça n'invalide rien du tout. Si le textField est editable, il accepte d'office le "drag & drop".
Quelle est la bonne solution pour qu'un textField soit editable et refuse le "drag & drop" ?
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je n'ai trouvé que deux solutions sur le web, uniquement pour des TextView.
En sous-classant NSTextView: à l'expérience, ça marche si on ne change pas la taille du TextView.
Si on change sa taille, le textView accepte les "drag&drop" (incompréhensible!).
L'autre solution consiste à ajouter une catégorie: cette deuxième solution est (parait-il) à éviter
En plus j'ai pas regardé mais si cette méthode existe dans l'API, c'est en effet une très mauvaise idée d'utiliser une catégorie, ne jamais surcharger une méthode existante par catégorie on n'a aucune garantie de l'ordre de chargement des diverses images binaires (frameworks, librairies, etc) et donc qui va supplanter l'autre.
de mettre un NSTrackingArea dans 'initialisation de ton contrôle,
puis de mettre les fonctions suivantes:
J'ai trouvé la deuxième méthode sur le réseau. Je ne l'ai pas essayé vu les commentaires qui ont suivis et qui sont les mêmes que les tiens.
@devulder
Je n'ai pas tout compris de la philosophie de ce que tu décris:
Le NSTrackingArea est à mettre sur la partie ou le drag&drop doit être invalidé ?
Suivant ce que tu indiques, je vais obtenir un event quand la souris rentrera sur la zone et je n'en aurai pas lorsque la souris en sortira.
Donc, je ne comprends pas comment cela va interdire le drag&drop sur le NSTexField.
Etape 1
Tu met le NSTrackingArea pour toute la surface de ton contrôle,
Etape 2
Tu désactives ton contrôle.
Maintenant quand la souris rentrera dans la zone le drag & drop sera invalidé vu que le contrôle est désactivé !
J'ai tester ça marche nickel
avec NSDragOperationNone qui n'autorise aucune opération.