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
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