Implementar o Método de Delegado no NSTextField

0

Pergunta

Eu estou tentando implementar um método de delegado no NSTextField como descrito no presente artigo, da Apple. Meu objetivo é que o NSTextField para aceitar retornos de carro e guias. Eu li em outros lugares (incluindo o artigo ligado) que NSTextView é uma escolha melhor. No entanto, eu estou trabalhando dentro de um framework multiplataforma que não tenha suporte para NSTextViewe NSTextField vai fazer o trabalho, se eu posso fazê-lo aceitar retornos de carro.

Com base no artigo, aqui está o meu código:

@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

Além disso, a Identidade do Inspetor do campo de texto, eu mudei o nome da classe do padrão NSTextField meu nome da classe. No entanto, quando eu executar o meu programa, o delegado método nunca é chamado. Há mais alguma coisa que eu tenho que fazer para configurar isso no Interface Builder?

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

Melhor resposta

0

Há algumas partes da documentação ligado que é pertinente que eu acho que pode ter sido negligenciado.

Que eu tenha copiado algumas das linhas abaixo:

Se você decidir continuar usando o NSTextField, permitindo a tecla tab e/ou permitindo entrar e voltar chaves para quebras de linha pode ser alcançado através da implementação das seguintes delegado método:

  • (BOOL)controle:(NSControl*)controle textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector;

Nota: Ao implementar esse delegado método em seu próprio objeto , você deve definir o seu objeto como "delegado" para este NSTextField.

Eu negrito alguns dos textos explicativos que eu acho que pode ter sido perdido.

Este método é dentro do NSControlTextEditingDelegate protocolo dentro de comando NSControl.h. Como tal, deve ser implementada por uma classe que implementa a NSControlTextEditingDelegate (i.é. NSTextFieldDelegate)

Uma maneira comum de fazer isso é ter o ViewController "segurando" o NSTextField ser o NSTextFieldDelegate.

Aqui está um exemplo muito simples utilizar o código de exemplo da Apple ligado:

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

Em seguida, defina o NSTextField delegado para o ViewController

Set_Text_Field_Delegate

Não há necessidade de adicionar uma personalizada subclasse.

Alternativamente, você poderia provavelmente fazer com que o campo de texto personalizado subclasse seu próprio representante. Algo ao longo dessas linhas:

#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

Pude descobrir isso usando o ViewController padrão que você deu. Vou marcar esta como uma resposta, e muito obrigado. Pode ser útil incluir que, para fazer o ponto de Vista do objeto do Controlador disponível como um delegado de destino, você tem que arrastar um controlador de visualização da biblioteca de paleta para coluna da esquerda da janela e, em seguida, altere sua classe no inspetor. (Isto é, assumir sei absolutamente nada sobre o IB, que vai para este projeto, eu estava perto.) Também, eu não incluem viewDidLoad ou setRepresentedObject na minha implementação, mas parece funcionar. Problema?
rpatters1

@rpatters1 Feliz que a resposta ajudou. Ao criar um novo aplicativo macOS no Xcode ele cria um padrão ViewController classe que é o que eu usei no exemplo aqui. viewDidLoad e setRepresentedObject são automaticamente adicionados a esta classe padrão (que é por isso que eu deixei aqui), embora ela não deve alterar a funcionalidade em todos, como você observou.
R4N

Eu estou trabalhando em um plugin para um host de aplicativo que fornece suporte multi-plataforma para caixas de diálogo. Assim, meu projeto não tinha Controlador de Visualização até que eu tenha adicionado.
rpatters1

Em outros idiomas

Esta página está em outros idiomas

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