いくつかの NSTextFields を持つ Mac アプリケーション (SDK 10.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
このコードを実行して 3 つのテキスト フィールド間でタブ移動すると、コンソールに次の出力が表示されます。
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 キーを押す (または非アクティブなテキスト フィールドの 1 つをクリックする) たびに、アプリは出力します。
<new first responder> didResignFirstResponder = YES
<new first responder> didBecomeFirstResponder = YES
そんなはずないでしょ
<old first responder> didResignFirstResponder = YES
<new first responder> didBecomeFirstResponder = YES
???
ここで何かひどく間違っていますか?
のドキュメントは- (BOOL)resignFirstResponder
言う
ウィンドウでファーストレスポンダーとしてのステータスを放棄するよう求められたことを受信者に通知します。
では、なぜresignFirstResponder
古いファーストレスポンダーではなく、新しいファーストレスポンダーに呼び出されるのでしょうか?