首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSResponder resignFirstResponder对错误的对象触发

NSResponder resignFirstResponder对错误的对象触发
EN

Stack Overflow用户
提问于 2014-12-22 13:55:59
回答 1查看 609关注 0票数 2

我有一个带有一些NSTextFields的Mac应用程序(SDK10.10):

由于我需要在文本字段获得和放弃焦点时得到通知,所以我将NSTextField子类:

代码语言:javascript
复制
@interface MyTextField : NSTextField
@end

@implementation MyTextField

- (BOOL)becomeFirstResponder
{
    BOOL didBecomeFirstResponder = [super becomeFirstResponder];
    NSLog(@"%@ didBecomeFirstResponder = %@", [self accessibilityLabel], didBecomeFirstResponder?@"YES":@"NO");
    return didBecomeFirstResponder;
}

- (BOOL)resignFirstResponder
{
    BOOL didResignFirstResponder = [super resignFirstResponder];
    NSLog(@"%@ didResignFirstResponder = %@", [self accessibilityLabel], didResignFirstResponder?@"YES":@"NO");
    return didResignFirstResponder;
}

@end

当运行这段代码并在三个文本字段之间加标签时,我在控制台中得到了这个输出:

代码语言:javascript
复制
firstField didResignFirstResponder = YES
firstField didBecomeFirstResponder = YES
secondField didResignFirstResponder = YES
secondField didBecomeFirstResponder = YES
thirdField didResignFirstResponder = YES
thirdField didBecomeFirstResponder = YES
firstField didResignFirstResponder = YES
firstField didBecomeFirstResponder = YES
secondField didResignFirstResponder = YES
secondField didBecomeFirstResponder = YES

每次我按TAB键(或单击其中一个不活动的文本字段),应用程序就会输出。

代码语言:javascript
复制
<new first responder> didResignFirstResponder = YES
<new first responder> didBecomeFirstResponder = YES

不是吗?

代码语言:javascript
复制
<old first responder> didResignFirstResponder = YES
<new first responder> didBecomeFirstResponder = YES

???

我这里有什么严重的问题吗?

- (BOOL)resignFirstResponder的文档显示

通知接收方,它已被要求放弃其窗口中的第一个响应者的身份。

那么,为什么resignFirstResponder会调用新的第一响应者而不是旧的响应者呢?

EN

回答 1

Stack Overflow用户

发布于 2015-05-26 16:29:22

我也遇到了同样的问题,无法找到解决方案,因此我最终解决了这个问题,并为了同样的目的使用了textDidEndEditing()方法。Swift代码:

MyTextField子类NSTextField,并向其添加myDelegate属性,以便在文本字段失去焦点后处理逻辑。

代码语言:javascript
复制
class MyTextField : NSTextField
{

/// Custom delegate with other methods than NSTextFieldDelegate.
var myDelegate: MyTextFieldDelegate? = nil;

override func becomeFirstResponder() -> Bool {
    let became = super.becomeFirstResponder();
    if (became) {
        self.myDelegate?.myTextFieldDidBecomeFirstResponder(self);
    }
    return became;
}

override func resignFirstResponder() -> Bool {
    let resigned = super.resignFirstResponder();
    if (resigned) {
        self.myDelegate?.myTextFieldDidResignFirstResponder(self);
    }
    return resigned;
}

override func textDidEndEditing(obj: NSNotification) {
    super.textDidEndEditing(obj);
    self.myDelegate?.myTextFieldDidResignFirstResponder(self);
}

}

议定书本身:

代码语言:javascript
复制
protocol MyTextFieldDelegate
{

    func myTextFieldDidBecomeFirstResponder(textField: MyTextField);

    func myTextFieldDidResignFirstResponder(textField: MyTextField);
}

显然,您可以直接实现丢失/获取的焦点逻辑,而不是使用和调用委托(例如,绘制不同的边界,等等)。

线索是textDidEndEditing()方法,当我在另一个字段中单击、按enter或退出时,它似乎工作得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27604111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档