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