【问题标题】:How can I make my NSTextField NOT highlight its text when the application starts?如何让我的 NSTextField 在应用程序启动时不突出显示其文本?
【发布时间】:2015-05-01 00:49:43
【问题描述】:

当我的应用程序启动时,第一个 NSTextField 被选择如下:

我可以很好地编辑NSTextField,但是当我按下回车结束编辑时,文本再次被选中,并且编辑没有结束。

我遵循了 Apple 教程 here,但我遇到了同样的问题,即文本字段被永久突出显示。

我该如何阻止这种情况?我想要它,因此文本字段不是应用程序的第一响应者,因此不会立即对其进行编辑,并且在对其进行编辑时,单击文本字段外部将结束它。在后一种情况下,我不确定在哪里放置 [[textField window]makeFirstResponder:nil] 以停止编辑。

我正在运行 Yosemite 10.10.2。

【问题讨论】:

  • 嗨!我可能有一个可行的解决方案。您希望能够在文本字段中使用标签吗?

标签: objective-c macos cocoa nstextfield


【解决方案1】:

不需要子类。只需设置refusesFirstResponder = YES;

NSTextField *textField = [NSTextField new];
textField.refusesFirstResponder = YES;

就是这样!这样做,它不会突出显示字段中的文本。

【讨论】:

    【解决方案2】:

    我正在使用 IB,NSTextField 上有一个名为 Refuses First Responder 的属性。勾选将阻止在显示窗口后立即突出显示文本字段。在this question 中有一些关于Refuses First Responder 的更详细信息。

    【讨论】:

      【解决方案3】:

      由于becomeFirstResponderNSTextField 中的默认实现,您的文本字段正在选择文本。

      为了防止选择,继承NSTextField,并覆盖becomeFirstResponder以取消选择任何文本:

      - (BOOL) becomeFirstResponder
      {
          BOOL responderStatus = [super becomeFirstResponder];
      
          NSRange selectionRange = [[self  currentEditor] selectedRange];
          [[self currentEditor] setSelectedRange:NSMakeRange(selectionRange.length,0)];
      
          return responderStatus;
      }
      

      由此产生的行为是该字段在获得焦点时不选择文本。

      为了不让第一响应者成为第一响应者,请在您的应用程序完成启动后致电makeFirstResponder:nil。我喜欢继承NSObject 来定义doInitWithContentView:(NSView *)contentView,并从我的NSApplicationDelegate 中调用它。在下面的代码中,_window 是一个IBOutlet

      - (void) applicationDidFinishLaunching:(NSNotification *)aNotification {
          // Insert code here to initialize your application
      
          [_menuController doInitWithContentView:_window.contentView];
      }
      

      应用程序启动时您的字段获得焦点的原因是窗口自动将焦点赋予第一个控件。它通过从左到右、自上而下扫描来确定首先考虑的内容(它首先从左到右扫描,因为放置在右上角的文本字段仍将获得焦点)。 需要注意的是,如果窗口为 restorable,并且您从 Xcode 中终止应用程序,那么任何上次获得焦点的字段都将保留上次执行时的焦点状态。

      【讨论】:

      • 我需要文本字段来选择文本,所以覆盖 becomeFirstResponder 不是一个解决方案。实际上我已经尝试过调用 makeFirstResponder:nil 的方法,但这也不起作用。我还确保我的窗户是不可恢复的,但这似乎不是问题的一部分。
      • 什么时候需要选择文本?您能否更详细地描述您需要的行为?
      • 如果您不想选择它的唯一时间是应用程序启动时,那么您可能需要做的就是从不同的地方调用makeFirstResponder:。我用一个非常简单的例子进行了尝试,它对我有用。您是否尝试从applicationDidFinishLaunching: 调用它?
      • 我尝试从有问题的窗口控制器的awakeFromNib 调用它,这应该在applicationDidFinishLaunching 之后发生
      • 我认为那是你的问题。 awakeFromNib 给了我一些问题。我现在从 applicationDidFinishLaunching 或以后进行所有 UI 初始化。
      猜你喜欢
      • 2021-11-12
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多