Ci sono alcune parti della documentazione legata pertinente che penso che potrebbe essere stato trascurato.
Ho copiato un paio di righe sotto:
Se si decide di continuare a utilizzare NSTextField, consentendo il tasto tab e/o consentendo l'invio e la restituzione delle chiavi per interruzioni di linea può essere raggiunto attraverso l'applicazione dei seguenti delegato metodo:
- (BOOL)controllo:(NSControl*)controllo textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector;
Nota: Quando si implementa questo delegato metodo in oggetto proprio l'oggetto come "delegato" per questo NSTextField.
Ho in grassetto alcune delle didascalie che penso che potrebbe essere stato perso.
Questo metodo è all'interno del NSControlTextEditingDelegate
protocollo entro NSControl.h. Come tale dovrebbe essere implementata da una classe che implementa l' NSControlTextEditingDelegate
(cioè NSTextFieldDelegate
)
Un modo comune per fare questo è quello di avere il ViewController "holding" la NSTextField essere il NSTextFieldDelegate
.
Ecco un esempio molto semplice utilizzando il codice di esempio da Apple è collegata:
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
Quindi impostare il vostro NSTextField delegato il ViewController
Non c'è bisogno di aggiungere un custom sottoclasse.
In alternativa si potrebbe probabilmente rendere il campo di testo personalizzato sottoclasse suo delegato. Qualcosa lungo queste linee:
#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