【问题标题】:Anyway to make a (wrapping) NSTextField write a carriage return upon pressing return key?无论如何要让(包装)NSTextField 在按下回车键时写回车?
【发布时间】:2011-05-24 21:18:57
【问题描述】:

我想在我的应用程序中使用可能包含回车符的换行文本字段。有什么方法可以强制 NSTextField 对象在按下 Return 键时将回车写入文本区域,而不是将其操作发送到目标?

【问题讨论】:

  • 您确定要这样做吗?那么你打算如何返回文本字段呢?
  • 我将其值绑定(持续更新)到模型类中的 nsstring。用户只需单击其他内容即可“返回”它。

标签: objective-c cocoa nstextfield


【解决方案1】:

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

【讨论】:

    【解决方案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];
        }
    }
    

    【讨论】:

      【解决方案3】:

      我发现 Sean 和 Bevarious 的组合最适合我。肖恩的回答假定总是希望将新行添加到末尾(而不是例如放置用户光标的位置)。

      -(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];
          }
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-04-10
          • 1970-01-01
          • 2010-11-13
          • 2019-12-23
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 2012-08-02
          • 1970-01-01
          相关资源
          最近更新 更多