【问题标题】:How to resign focus on NSTextField when clicking outside单击外部时如何放弃对 NSTextField 的关注
【发布时间】:2015-03-19 06:29:06
【问题描述】:

我有一个带有可编辑 NSTextField 的 NSView 和多个其他子视图,如 NSView、NSSlider、NSImage 等。

  1. 在我将文本输入到可编辑的 NSTextField 并单击任何其他视图、移动滑块等之后。我希望我的 NSTextField 失去焦点。我试过打电话给resignFirstResponder,但这似乎不起作用。我该怎么做?
  2. 当我在 NSTextField 中标记文本时,会显示文本后面的蓝色背景。这个怎么改颜色?

【问题讨论】:

  • 我认为您应该将这些问题作为 2 个单独的问题提出。如果一个人对 (1) 给出最佳答案,而另一个人对 (2) 给出最佳答案,你将如何接受答案?

标签: objective-c cocoa nstextfield


【解决方案1】:

假设您有一个名为 clickView1.h 的 NSView 子类。参考this post,您可以通过以下方式实现您在No. 1中的目标。

- (void)mouseDown:(NSEvent *)event{
    AppDelegate *appDelegate = (AppDelegate *)[NSApp delegate];
    [appDelegate.window makeFirstResponder:nil];
}

至于第二个问题,我没看懂。

【讨论】:

  • 谢谢。广告 2) 有一个错字。它是标记 NSTextField 中的文本时显示的蓝色标记背景(例如,如果您想复制它)。是否可以更改该颜色?
  • 说蓝色标记背景,听起来你指的是对焦环。我建议您打开一个新主题,而不是在一个主题下提出两个单独的问题。
  • 与其寻找应用代理,不如说[[self window] makeFirstResponder: nil] 似乎更简单。
  • 很高兴了解 NSApp 的做法。想象一下,如果您在另一个窗口中单击,那么 self 是不正确的。我大部分时间都使用 self.window。
  • self.window 将返回您的窗口,该视图绑定到,而不是当前窗口。所以,self.window 是正确的,appDelegate.window 是不正确的,因为它可能是您应用的另一个窗口。
【解决方案2】:

对于问题 1,我同意 BlueTomato 的观点,即您需要做其他事情的第一响应者,而不是致电 resignFirstResponder。对于问题 2,子类 NSTextFieldCell,并在子类中具有这样的覆盖:

- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj
{
    [super setUpFieldEditorAttributes: textObj];

    if ([textObj isKindOfClass: [NSTextView class]])
    {
        NSTextView* textView = (NSTextView*) textObj;

        [textView setSelectedTextAttributes:
            [NSDictionary dictionaryWithObjectsAndKeys:
                [NSColor redColor],
                NSBackgroundColorAttributeName,
                nil] ];
    }

    return textObj;
}

【讨论】:

  • 这是他可以使用的另一个很酷的技巧。但他不是在说对焦环的颜色吗?
  • @BlueTomato,他说的是“文字后面”,不是“文字周围”,所以我以为是高亮颜色。
  • 我不怪你。我可以使用你的代码。所以你明白我的意思了。
  • 谢谢,setUpFieldEditorAttributes 帮了我大忙!
【解决方案3】:

试试下面的方法:

 [[NSApp mainWindow] performSelector:@selector(resignFirstResponder:)
                          withObject:yourTextfield
                          afterDelay:0.0];

【讨论】:

猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
相关资源
最近更新 更多