【问题标题】:Deselecting Text in NSTextField取消选择 NSTextField 中的文本
【发布时间】:2015-04-23 08:04:16
【问题描述】:

在开发一个新应用程序时,我遇到了与取消选择输入到 nstextfield 中的文本有关的相同问题:http://www.cocoabuilder.com/archive/cocoa/195313-nstextfield-how-to-deselect-text.html

关于使用 NSTextViews 执行此操作有很多关于 SO 的问题,但我无法找到 NSTextFields 的有效答案。

在我的项目中,我有一个带有文本字段的窗口,其中有一个控制器类,它也是文本字段的委托。我有一个用于输入时发送的文本字段的 IBAction,它根据字段中的文本执行操作,以及:

(void)controlTextDidChange:(NSNotification *)note

(BOOL)control:(NSControl *)control
       textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector 

Suppressing the text completion dropdown for an NSTextField的答案中处理一些自定义自动完成

我的问题在于,当我按 Enter 提交输入的文本时,字段中的字符串被完全选中,但我希望能够取消选择文本并将插入点放在末尾,如第一个链接。

我可以在多个地方取消选择文本,但实际上取消选择不起作用。我已尝试按照第一个链接中的说明获取字段编辑器,我也尝试使用 controlTextDidEndEditing: 方法,因为我确实在上面的 controlTextDidChange: 方法中获得了字段编辑器:

- (void)controlTextDidEndEditing:(NSNotification *)note{

    NSTextView *textView = [[note userInfo] objectForKey:@"NSFieldEditor"];
    [textView setSelectedRange:NSMakeRange([[self.ParseField stringValue]length]-1, 0)
                      affinity:NSSelectionAffinityUpstream
                stillSelecting:NO];


}

我也尝试在现场禁用和重新启用编辑,但这也没有用。

能够向文本字段发送 moveDown: 消息这样简单的事情对我有用,因为它与点击向下箭头相同,但文本字段无法识别该选择器。 (我以为 NSTextField 继承自 NSResponder,所以它会工作,但我猜不是?)

感谢您的帮助

【问题讨论】:

  • 也许您应该使用[yourTextField becomeFirstResponder]; 将焦点设置到NSTextField(参见stackoverflow.com/questions/764179/focus-a-nstextfield
  • @Sudo 在我意识到他们使用的是 NSTextView 而不是 NSTextField 之后,我刚刚删除了适用于文本字段的答案
  • @nintandrew 你能再看看你的问题吗?不清楚你是否想要一个 NSTextView 或 NSTextField 的答案。我现在将恢复我的答案
  • @Sudo 我不需要将文本字段注册为第一响应者,但是按照该链接中的建议和 Markhunte 的回答帮助我找到了答案
  • @markhunte 我问的是 NSTextField,谢谢你的帮助!

标签: objective-c macos nstextfield deselect


【解决方案1】:

我一直在寻找 Swift 3 中的解决方案,所以这对我有用:

theTextField.currentEditor()?.selectedRange = NSMakeRange(0, 0)

【讨论】:

    【解决方案2】:

    在一个只有窗口和文本字段的简单应用中。

    我将 textField 设置为 firstResponder。

    这会在应用运行时选择文本。

    如果我添加到 applicationDidFinishLaunching

    NSRange tRange = [[ _theTextField currentEditor] selectedRange]; [[ _theTextField currentEditor] setSelectedRange:NSMakeRange(tRange.length,0)];

    现在运行时,文本没有被选中,插入点在文本的末尾。

    我使用 selectedRange 来获取选择字符的长度。由于一开始就选择了文本,而且看起来更简单。

    - (void)awakeFromNib{
        [_theTextField setStringValue:@"100000"];
    
    }
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        [[[NSApplication sharedApplication] mainWindow] makeFirstResponder:_theTextField];
    
        NSRange   tRange = [[ _theTextField  currentEditor] selectedRange];
        [[ _theTextField  currentEditor] setSelectedRange:NSMakeRange(tRange.length,0)];
    

    }

    【讨论】:

    • 这个答案最终让我找到了我的解决方案。最后,不是需要将文本字段注册为第一响应者。相反,选择文本,然后使用 currentEditor 调整选择范围就可以了。我以前不知道 currentEditor,我应该更多地关注 NSControl 而不是 NSResponder。感谢您的帮助!
    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多