强制Cocoa文本字段结束编辑

时间:2010-02-17 20:29:26

标签: cocoa macos nstextfield

我有一个基于视图的gui,其中包含每个gui项目的文本字段。当我选择另一个菜单项时,我希望我的文本字段退出编辑模式。我无法在nsTextField文档中找到这样做。有任何想法吗?

4 个答案:

答案 0 :(得分:47)

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

[[textField window] makeFirstResponder:nil];

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

答案 1 :(得分:11)

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]; - 我需要使用一些非零NSResponder子类调用makeFirstResponder(这可以是NSWindow的内容视图或NSViewController的视图,它们都适用于我的情况,或者是一些假的NSTextField视图,对于更复杂的情况,这些视图对用户不可见。)

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

答案 2 :(得分:6)

我知道这是一个老问题,但万一有人对swift 3感到疑惑,它只适用于我

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

Swift 4.2 udpate,nil使窗口成为第一个响应者。否则抛出错误。

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

答案 3 :(得分:0)

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

[textField.window makeFirstResponder:nil];

这适用于主窗口。但这对模态窗口效果不佳。

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

dispatch_async(dispatch_get_main_queue(), ^{
        [textField.window makeFirstResponder:nil];
    });