22

我有一个基于视图的 gui,其中包含每个 gui 项的文本字段。当我选择另一个菜单项时,我希望我的文本字段退出编辑模式。我无论如何都找不到在 nsTextField 文档中执行此操作。有任何想法吗?

4

4 回答 4

59

您需要告诉窗口从控件中删除第一响应者状态:

[[textField window] makeFirstResponder:nil];

这将结束编辑并从文本字段中移除焦点。

于 2010-02-17T23:54:26.823 回答
12

以下来自cocoabuilder.com 的解决方案 - Stop edit session with a NSTextField适用于我在 OS X 10.9 和 OS X 10.10 for Objective-C 和 10.10 for Swift 上。

这是Objective-C版本:

@implementation CustomTextField

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    self.target = self;
    self.action = @selector(action:);

    return self;
}

- (void)action:(NSTextField *)textField {
    // Make something else first responder, something neutral 
    // (or can be a fake invisible element)
    [self.window makeFirstResponder:self.window.contentView];

    // Other code
}

@end

背景:本主题中接受的解决方案在 OS X 10.9 和 10.10 上从未对我有用,因此[[textField window] makeFirstResponder:nil];与其建议的那样调用 - 我需要makeFirstResponder使用一些非零 NSResponder 子类调用(这可以是 NSWindow 的内容视图或 NSViewController 的视图,两者都可以工作在我的情况下或一些假的 NSTextField 视图,对于更复杂的情况,用户看不到)。

重要细节:-[NSWindow makeFirstResponder]必须在 NSTextField 的操作选择器中准确调用,如我的示例所示。NSTextField 方法管道中没有其他地方对我有用(textDidEndEditing:、textShouldEndEditing: 或 control:textShouldEndEditing:)

于 2015-05-28T17:33:37.393 回答
7

我知道这是一个老问题,但如果有人想知道 swift 3,它只对我有用

DispatchQueue.main.async {
    self.window?.makeFirstResponder()
}

Swift 4.2 更新, nil使窗口成为它的第一响应者。否则抛出错误。

DispatchQueue.main.async {
    self.window?.makeFirstResponder(nil)
}
于 2017-02-09T22:57:06.910 回答
0

此命令应在 viewWillLayout 中使用,如果需要在 viewWillAppear 和 . 就这样。没有子类和并行线程。

[textField.window makeFirstResponder:nil];

这适用于主窗口。但这不适用于模态窗口。

对于模态窗口,使用 viewDidAppear 或 dispatch_async:

dispatch_async(dispatch_get_main_queue(), ^{
        [textField.window makeFirstResponder:nil];
    });
于 2018-02-11T23:03:18.303 回答