Mettre en œuvre Délégué de la Méthode sur NSTextField

0

La question

Je tente de mettre en œuvre une méthode du délégué sur NSTextField comme décrit dans cet article d'Apple. Mon but est pour l' NSTextField pour accepter les retours chariot et les onglets. J'ai lu ailleurs (y compris l'article lié) qui NSTextView est un meilleur choix. Cependant, je suis en train de travailler dans un environnement multiplateforme cadre que le manque de soutien pour NSTextViewet NSTextField va faire le travail si je peux le faire pour accepter les retours chariot.

Fondée sur l'article, voici mon code:

@interface MyTextFieldSubclass : NSTextField
{}
- (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector;
@end

@implementation MyTextFieldSubclass
- (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector
{
   BOOL result = NO;

   if (commandSelector == @selector(insertNewline:))
   {
      // new line action:
      // always insert a line-break character and don’t cause the receiver to end editing
      [textView insertNewlineIgnoringFieldEditor:self];
      result = YES;
   }
   else if (commandSelector == @selector(insertTab:))
   {
      // tab action:
      // always insert a tab character and don’t cause the receiver to end editing
      [textView insertTabIgnoringFieldEditor:self];
      result = YES;
   }

   return result;
}
@end

En outre, l'Identité de l'Inspecteur du champ de texte, j'ai changé le nom de la classe à partir de la valeur par défaut NSTextField pour mon nom de classe. Cependant, lorsque je lance mon programme, le délégué de la méthode n'est jamais appelé. Est-il autre chose que j'ai à faire pour le configurer dans l'Interface Builder?

cocoa interface-builder objective-c
2021-11-17 17:05:19
1

La meilleure réponse

0

Il y a quelques parties de la documentation liée qui est pertinente qui, je pense, ont été négligées.

J'ai copié quelques lignes ci-dessous:

Si vous décidez de continuer à utiliser NSTextField, permettant la touche de tabulation et/ou permettant d'entrer et de rendement clés pour les sauts de lignes peut être atteint par la mise en œuvre de la suite de délégué de la méthode:

  • (BOOL)de contrôle:(NSControl*)contrôle textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector;

Remarque: Lors de la mise en œuvre de ce délégué méthode dans votre propre objet , vous devez définir votre objet comme le "délégué" pour ce NSTextField.

J'ai mis en caractères gras un peu de la légende qui, je pense, ont été manqués.

Cette méthode est à l'intérieur de la NSControlTextEditingDelegate protocole au sein de NSControl.h. Comme telle, elle doit être implémentée par une classe qui implémente l' NSControlTextEditingDelegate (c'est à dire NSTextFieldDelegate)

Une façon courante de le faire est d'avoir le ViewController "holding" le NSTextField être le NSTextFieldDelegate.

Voici un exemple très simple à l'aide de l'exemple de code à partir d'Apple est lié:

ViewController.h

#import <Cocoa/Cocoa.h>

@interface ViewController : NSViewController <NSTextFieldDelegate>


@end

ViewController.m

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
}


- (void)setRepresentedObject:(id)representedObject {
    [super setRepresentedObject:representedObject];

    // Update the view, if already loaded.
}

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
    BOOL result = NO;
     
        if (commandSelector == @selector(insertNewline:))
        {
            // new line action:
            // always insert a line-break character and don’t cause the receiver to end editing
            [textView insertNewlineIgnoringFieldEditor:self];
            result = YES;
        }
        else if (commandSelector == @selector(insertTab:))
        {
            // tab action:
            // always insert a tab character and don’t cause the receiver to end editing
            [textView insertTabIgnoringFieldEditor:self];
            result = YES;
        }
     
    return result;
}


@end

Ensuite, réglez votre NSTextField déléguée pour la ViewController

Set_Text_Field_Delegate

Pas besoin d'ajouter une sous-classe personnalisée.

Sinon, vous pourriez probablement faire le champ texte personnalisé sous-classe de ses propres délégués. Quelque chose le long de ces lignes:

#import "MyTextFieldSubclass.h"

@interface MyTextFieldSubclass() <NSTextFieldDelegate>
@end

@implementation MyTextFieldSubclass

- (instancetype)init {
    self = [super init];
    if (self) {
        self.delegate = self;
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        self.delegate = self;
    }
    return self;
}

- (instancetype)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];
    if (self) {
        self.delegate = self;
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
    
    // Drawing code here.
}

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
    BOOL result = NO;

       if (commandSelector == @selector(insertNewline:))
       {
          // new line action:
          // always insert a line-break character and don’t cause the receiver to end editing
          [textView insertNewlineIgnoringFieldEditor:self];
          result = YES;
       }
       else if (commandSelector == @selector(insertTab:))
       {
          // tab action:
          // always insert a tab character and don’t cause the receiver to end editing
          [textView insertTabIgnoringFieldEditor:self];
          result = YES;
       }

       return result;
}

@end
2021-11-18 01:22:32

J'ai fini par le comprendre à l'aide de la ViewController patron vous a donné. Je vais donner une réponse, et je vous remercie. Il pourrait être utile d'inclure dans le but de rendre la Vue de l'objet Contrôleur disponibles en tant que délégué de la cible, vous devez faire glisser un point de vue contrôleur de la palette des bibliothèques de la colonne de gauche de la fenêtre, puis changez de classe dans l'inspecteur. (C'est assumer je ne connais absolument rien au sujet de l'IB, qui va dans ce projet, j'ai été à proximité.) Aussi, je n'ai pas viewDidLoad ou setRepresentedObject dans mon œuvre, mais il semble fonctionner. Problème?
rpatters1

@rpatters1 Content de la réponse aidé. Lors de la création d'un nouveau macOS application dans Xcode, il crée un par défaut ViewController classe qui est ce que j'ai utilisé dans l'exemple ici. viewDidLoad et setRepresentedObject sont automatiquement ajoutés à cette classe par défaut (c'est pourquoi je les ai laissés ici), mais il ne faut pas changer la fonctionnalité à tous comme vous l'avez noté.
R4N

Je travaille sur un plugin pour un hôte-app qui fournit de la croix-plate-forme de soutien pour les boîtes de dialogue. Ainsi, mon projet n'avait pas de Vue-Contrôleur à tous jusqu'à ce que je l'ai ajouté.
rpatters1

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................