Realizovať Delegovať Metóda na NSTextField

0

Otázka

Snažím sa realizovať delegát metóda na NSTextField ako je popísané v tomto článku od Apple. Môj cieľ je pre NSTextField prijať prepravu vráti a karty. Prečítal som inde (vrátane článku spojené), ktoré NSTextView je lepšou voľbou. Avšak, ja som pracovala v multiplatformová rámec, ktorý nemá podporu pre NSTextViewa NSTextField bude robiť svoju prácu, ak môžem to prijať prepravu, vráti.

Na základe článku, tu 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

Navyše, v Identity Kontrolór textové pole, zmenil som názov triedy z predvolenej NSTextField moje meno triedy. Avšak, keď som spustiť môj program, delegáta metóda nikdy dostane tzv. Je tam niečo, čo iné mám robiť, ak chcete nastaviť túto možnosť v Interface Builder?

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

Najlepšiu odpoveď

0

Tam sú niektoré časti dokumentácie ste prepojenie, ktoré je relevantné, že si myslím, že môže byť zanedbané.

Som kopíroval pár riadkov nižšie:

Ak sa rozhodnete držať pomocou NSTextField, čo tabulátora a/alebo umožňuje zadať a vrátiť kľúče pre line-prestávky možno dosiahnuť realizáciou nasledovných delegovať metóda:

  • (BOOL)ovládanie:(NSControl*)ovládanie textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector;

Poznámka: Pri plnení tohto delegáta metódy na svoje vlastné objektu , mali by ste nastaviť váš objekt sa ako "delegovať" pre tento NSTextField.

Som tučne niekoľko callouts ktoré si myslím, že by mohol ujsť.

Táto metóda je v rámci NSControlTextEditingDelegate protokol v rámci NSControl.h. Ako by sa mali realizovať triedy, ktorá implementuje NSControlTextEditingDelegate (napr. NSTextFieldDelegate)

Jeden spoločný spôsob, ako to urobiť, je mať ViewController "držať" na NSTextField byť NSTextFieldDelegate.

Tu je veľmi jednoduchý príklad používaní vzorového kódu z Apple si prepojené:

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

Potom nastavte NSTextField je delegovať na ViewController

Set_Text_Field_Delegate

Nie je potrebné pridávať vlastné podtrieda.

Alternatívne pravdepodobne by ste mohli urobiť vlastný text oblasti podtrieda vlastného delegáta. Niečo spolu tieto riadky:

#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

Som si nakoniec zistiť to, pomocou ViewController vzor si dal. Budem označiť ako odpoveď a ďakujem. Môže to byť užitočné, ak chcete zahrnúť že v záujme, aby View Controller objekt k dispozícii ako delegát cieľ, budete musieť presunúť zobrazenie regulátora z knižnice palety na ľavom stĺpci okna a potom zmeňte svoju triedu v inšpektor. (Teda predpokladať, viem, že absolútne nič o IB, ktorá ísť do tohto projektu som bol blízko.) Tiež som nezahrnul viewDidLoad alebo setRepresentedObject v mojej implementácii, ale zdá sa do práce. Problém?
rpatters1

@rpatters1 Rád, že odpoveď pomohla. Pri vytváraní nového macOS aplikáciu v Xcode ho vytvorí predvolené ViewController trieda, ktorá je to, čo som použil ako príklad. viewDidLoad a setRepresentedObject sú automaticky pridané do tohto predvolené triedy (čo je dôvod, prečo som sa nechal v tu) hoci by to nemalo zmeniť funkčnosť na všetkých, ako ste si poznačili.
R4N

Pracujem na plugin pre hosť-aplikácia, ktorá poskytuje cross-platform podporu pre dialógové okná. Teda, môj projekt nemal žiadny Názor Radič na všetkých, až kým som ho pridala.
rpatters1

V iných jazykoch

Táto stránka je v iných jazykoch

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