Istnieje kilka części dokumentacji, które się połączyły, które odnoszą się do rzeczy, i myślę, że się nimi, być może, zaniedbane.
Skopiowałem kilka wierszy poniżej:
Jeśli zdecydujesz się kontynuować korzystanie z NSTextField, rozdzielczość klawisza tab i/lub rozdzielczość klawiatury i powrócić do podziałów może być osiągnięte poprzez wdrożenie nowej metody delegowania:
- (BOOL)element sterujący:(NSControl*)element zarządzania TextView:(NSTextView*)Element zarządzania TextView docomandbyselector:(SEL)element zarządzania zespołami;
Uwaga: Przy realizacji tej metody delegowania w swoim własnym obiekcie należy skonfigurować swój obiekt jako "delegat" dla tego pola NSTextField.
Wyróżnić pogrubioną czcionką kilka выносков, które, jak mi się wydaje, może być pominięte.
Ta metoda jest w zasięgu NSControlTextEditingDelegate
protokół w NSControl.h. Jako taki, powinien być realizowany w klasie, który realizuje NSControlTextEditingDelegate
(tj. NSTextFieldDelegate
)
Jednym z najczęstszych sposobów, aby to zrobić-zrobić tak, aby ViewController, "utrzymujący" pole NSText, był NSTextFieldDelegate
.
Oto bardzo prosty przykład zastosowania przykład kodu z Apple, który związany:
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
Następnie zaznacz pełnomocnik twojego NSTextField w ViewController
Nie ma potrzeby, aby dodać niestandardowy podklasy.
Alternatywnie, prawdopodobnie mógłby zrobić podklasa niestandardowego pola tekstowego własnym delegatem. Coś w tym rodzaju:
#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