无论如何使(包装)NSTextField在按下返回键时写回车符?

时间:2011-05-24 21:18:57

标签: objective-c cocoa nstextfield

我想使用一个包装文本字段,它可能在我的应用程序中包含回车符。有没有办法强制NSTextField对象将回车写入文本区域,而不是在按下Return键时将其动作发送到目标?

4 个答案:

答案 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)
    }
}