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

由于我需要在文本字段获得和放弃焦点时得到通知,所以我将NSTextField子类:
@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当运行这段代码并在三个文本字段之间加标签时,我在控制台中得到了这个输出:
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键(或单击其中一个不活动的文本字段),应用程序就会输出。
<new first responder> didResignFirstResponder = YES
<new first responder> didBecomeFirstResponder = YES不是吗?
<old first responder> didResignFirstResponder = YES
<new first responder> didBecomeFirstResponder = YES???
我这里有什么严重的问题吗?
- (BOOL)resignFirstResponder的文档显示
通知接收方,它已被要求放弃其窗口中的第一个响应者的身份。
那么,为什么resignFirstResponder会调用新的第一响应者而不是旧的响应者呢?
发布于 2015-05-26 16:29:22
我也遇到了同样的问题,无法找到解决方案,因此我最终解决了这个问题,并为了同样的目的使用了textDidEndEditing()方法。Swift代码:
MyTextField子类NSTextField,并向其添加myDelegate属性,以便在文本字段失去焦点后处理逻辑。
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);
}
}议定书本身:
protocol MyTextFieldDelegate
{
func myTextFieldDidBecomeFirstResponder(textField: MyTextField);
func myTextFieldDidResignFirstResponder(textField: MyTextField);
}显然,您可以直接实现丢失/获取的焦点逻辑,而不是使用和调用委托(例如,绘制不同的边界,等等)。
线索是textDidEndEditing()方法,当我在另一个字段中单击、按enter或退出时,它似乎工作得很好。
https://stackoverflow.com/questions/27604111
复制相似问题