根据我在另一篇文章中提到的理解,我想出了一个答案。这有点令人费解,但它有效。您必须将 NSTextField 和 NSWindow 子类化,因为您需要两者的信息来设置它。这是子类:HMTextField.h
#import <Foundation/Foundation.h>
@interface HMTextField : NSTextField {
}
@end
HMTextField.m
#import "HMTextField.h"
#import "HMWindow.h"
@implementation HMTextField
- (BOOL)becomeFirstResponder {
[(HMWindow*)[self window] setTfBecameFirstResponder:YES];
return [super becomeFirstResponder];
}
@end
HMWindow.h
#import <Foundation/Foundation.h>
@interface HMWindow : NSWindow {
BOOL tfIsFirstResponder, tfBecameFirstResponder;
}
@property (nonatomic, readwrite, assign) BOOL tfBecameFirstResponder;
@end
HMWindow.m
#import "HMWindow.h"
@implementation HMWindow
@synthesize tfBecameFirstResponder;
-(id)init {
if (self = [super init]) {
tfIsFirstResponder = NO;
}
return self;
}
- (NSResponder *)firstResponder {
id fr = [super firstResponder];
if ([fr isEqualTo:[self fieldEditor:NO forObject:nil]]) {
tfIsFirstResponder = YES;
} else {
if (tfIsFirstResponder && tfBecameFirstResponder) {
NSLog(@"the text field stopped being first responder");
tfBecameFirstResponder = NO;
}
tfIsFirstResponder = NO;
}
return fr;
}
@end
制作类并使您的对象成为他们的类。您将在 HMWindow.m 文件中的 NSLog 消息所在的文本字段中收到第一响应者更改的通知。如果您需要帮助了解它是如何工作的,请告诉我。