Provedení Delegát Metodu na NSTextField

0

Otázka

Já jsem se snaží realizovat delegát na metodu NSTextField jak je popsáno v tomto článku od Apple. Mým cílem je pro NSTextField přijmout konce řádků a tabulátory. Četl jsem jinde (včetně odkazovaného článku), že NSTextView je lepší volbou. Nicméně, já jsem pracoval ve multiplatformní rámec, který postrádá podporu pro NSTextViewa NSTextField bude dělat svou práci, jestli můžu dostat to přijmout, kočár se vrací.

Na základě článku, tady je můj kód:

@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

Navíc, v Identity Inspektor textové pole, změnil jsem název třídy z výchozí NSTextField mé jméno třídy. Nicméně, když jsem běžet můj program, delegát metoda nikdy volána. Je ještě něco, co musím udělat, aby toto nastavení v Interface Builder?

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

Nejlepší odpověď

0

Existuje několik částí dokumentace propojením, které je příznačné, že si myslím, že může být zanedbané.

Opsal jsem pár řádků níže:

Pokud se rozhodnete, aby se pomocí NSTextField, což klávesy tab a/nebo umožní zadat a vrátit klíče pro line-přestávky může být dosaženo provedením následujících delegát metoda:

  • (BOOL)ovládání:(NSControl*)kontrolou textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector;

Poznámka: Při provádění tohoto delegáta metodu ve svém vlastním objektu , měli byste nastavit objekt jako "delegát" pro tento NSTextField.

Jsem tučně pár popisky, což si myslím, že by tu chyběla.

Tato metoda je v rámci NSControlTextEditingDelegate protokol v NSControl.h. Jako taková by měla být implementována pomocí třídy, která implementuje NSControlTextEditingDelegate (tj. NSTextFieldDelegate)

Jeden obyčejný způsob, jak to udělat, je mít ViewController "drží" NSTextField být NSTextFieldDelegate.

Zde je velmi jednoduchý příklad použití ukázkový kód z Apple vám spojeny:

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

Pak nastavit NSTextField je přenést do ViewController

Set_Text_Field_Delegate

Není třeba přidat vlastní podtřídy.

Alternativně můžete pravděpodobně vytvořit vlastní textové pole podtřídy vlastního delegáta. Něco podél těchto linek:

#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

Nakonec jsem to vyřešil pomocí ViewController vzor dal. Označím to jako odpověď, a děkuji vám. To by mohlo být užitečné zahrnout, že v zájmu, aby se View Controller objekt k dispozici jako delegát cíl, budete muset přetáhnout view controller z knihovny palety levém sloupci okna a pak změnit své třídě v inspektoru. (To je, předpokládám, že víte, absolutně nic o IB, které bude do tohoto projektu jsem byl blízko.) Také jsem nezahrnula viewDidLoad nebo setRepresentedObject v mém provedení, ale zdá se, že práce. Problém?
rpatters1

@rpatters1 Rád, že odpověď pomohla. Při vytváření nového macOS aplikace v Xcode vytvoří výchozí třída ViewController, který je to, co jsem použil v příkladu zde. viewDidLoad a setRepresentedObject jsou automaticky přidány do výchozí třídy (což je důvod, proč nechal jsem je tady) i když to by nemělo změnit funkčnost na všech, jak jste poznamenal.
R4N

Pracuji na pluginu pro hostitelské aplikace, která poskytuje cross-platformní podporu pro dialogová okna. Tak, můj projekt neměl View Controller vůbec, dokud jsem ho přidal.
rpatters1

V jiných jazycích

Tato stránka je v jiných jazycích

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