Punerea în aplicare Delega Metoda pe NSTextField

0

Problema

Eu sunt încercarea de a pune în aplicare un delegat metoda pe NSTextField după cum este descris în acest articol de la Apple. Scopul meu este pentru NSTextField să accepte transportul se întoarce și file. Am citit în altă parte (inclusiv articol legat), care NSTextView este o alegere mai bună. Cu toate acestea, eu sunt de lucru într-un multiplatformă cadru care nu are suport pentru NSTextViewși NSTextField va face treaba dacă pot să-l să accepte transportul se întoarce.

Pe baza articolului, aici este codul meu:

@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

În plus, în Identitatea Inspector de câmpul de text, mi-am schimbat numele clasei din default NSTextField la clasa mea de nume. Cu toate acestea, atunci când am rula programul meu, delegatul metoda nu este chemat. Mai e ceva ce trebuie să fac pentru a seta acest lucru în Interface Builder?

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

Cel mai bun răspuns

0

Există câteva părți din documentație legată de ceea ce este pertinent pe care cred că ar fi fost neglijate.

Am copiat câteva dintre liniile de mai jos:

Ar trebui să vă decideți să păstrați folosind NSTextField, permițându-tasta tab și/sau permițându-intra și de a reveni chei pentru line-break poate fi realizat prin implementarea următoarelor delega metoda:

  • (BOOL)de control:(NSControl*)controlul textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector;

Notă: atunci Când pun în aplicare acest delega metodă în propriul obiect trebuie să setați obiect ca "delegat" pentru acest NSTextField.

Am îngroșat câteva explicații care, cred eu, ar fi fost pierdut.

Această metodă este în NSControlTextEditingDelegate protocolul în cadrul NSControl.h. Ca atare, ar trebui să fie puse în aplicare de către o clasă care implementează NSControlTextEditingDelegate (de exemplu, NSTextFieldDelegate)

Un mod obișnuit de a face acest lucru este de a avea ViewController "holding" NSTextField fi NSTextFieldDelegate.

Aici e un exemplu foarte simplu, folosind mostre de cod de la Apple ai legat:

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

Apoi setați NSTextField delegat al ViewController

Set_Text_Field_Delegate

Nu este nevoie să adăugați un obicei subclasă.

Alternativ ai putea face, probabil, obiceiul câmp de text subclasa propriul său delegat. Ceva de-a lungul acestor linii:

#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

Am făcut-o în cele din urmă seama de acest lucru folosind ViewController model-ai dat. Eu va marca acest lucru ca un răspuns, și vă mulțumesc. Ar putea fi util să includă în scopul de a face View Controller obiect disponibil ca un delegat țintă, trebuie să trageți un controler de vedere de la biblioteca paleta de la coloana din stânga a ferestrei și apoi schimba clasa sa în inspectorul. (Care este, presupunem că nu știu absolut nimic despre IB, care merge în acest proiect am fost aproape.) De asemenea, nu am inclus viewDidLoad sau setRepresentedObject în punerea în aplicare a mea, dar pare să funcționeze. Problema?
rpatters1

@rpatters1 mă Bucur că răspunsul m-a ajutat. Atunci când creați un nou macOS aplicație în Xcode se creează un default ViewController clasa care este ceea ce am folosit în exemplul de aici. viewDidLoad și setRepresentedObject sunt adăugate automat la această default clasa (care este de ce le-am lăsat aici), deși nu ar trebui să schimbe funcționalitatea la toate, dupa cum ai remarcat.
R4N

Lucrez la un plugin pentru un host-aplicație care oferă suport cross-platform pentru casete de dialog. Astfel, proiectul meu nu a avut nici Vedere Controler, la toate până când am adăugat acesta.
rpatters1

În alte limbi

Această pagină este în alte limbi

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