我想使用一个包装文本字段,它可能在我的应用程序中包含回车符。有没有办法强制NSTextField对象将回车写入文本区域,而不是在按下Return键时将其动作发送到目标?
答案 0 :(得分:10)
Technical Q&A QA1454中介绍了这一点,其中还列举了在这种情况下人们使用NSTextField
代替NSTextView
的原因。
您可以在文本字段委托中实现以下方法:
- (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;
}
return result;
}
答案 1 :(得分:2)
好吧,我想出了一种方法,但这很可能不是最好的(甚至是好的)方式。我将NSTextField子类化,并像这样覆盖-textShouldEndEditing:
:
-(BOOL)textShouldEndEditing:(NSText *)textObject {
NSEvent * event = [[NSApplication sharedApplication] currentEvent];
if ([event type] == NSKeyDown && [event keyCode] == 36) {
[self setStringValue:[[self stringValue] stringByAppendingString:@"\n"]];
return NO;
}
else {
return [super textShouldEndEditing:textObject];
}
}
答案 2 :(得分:1)
我发现Sean和Bevarious的组合最适合我。 Sean的回答假定总是希望将新行添加到末尾(而不是例如放置用户光标的位置)。
-(BOOL)textShouldEndEditing:(NSText *)textObject
{
NSEvent * event = [[NSApplication sharedApplication] currentEvent];
if ([event type] == NSKeyDown && [event keyCode] == 36)
{
[textObject insertNewlineIgnoringFieldEditor:nil];
return NO;
}
else
{
return [super textShouldEndEditing:textObject];
}
}
答案 3 :(得分:0)
Swift版本:
override func textShouldEndEditing(textObject: NSText) -> Bool {
let event = NSApplication.sharedApplication().currentEvent
if event?.type == NSEventType.KeyDown && event?.keyCode == 36 {
self.stringValue = self.stringValue.stringByAppendingString("\n")
return false
} else {
return super.textShouldEndEditing(textObject)
}
}