我正在Mac OS X(Lion)上编写一个应用程序,这是一个工作管理程序。数据源是MySQL。
在一个窗口中,我有几个NSTextFields,这些NSTextFields子类化为我自己的NSTextField子类。我的子类名为HDLTextField。在我的子类中,我实现了委托textShouldBeginEditing,它运行得很好。
现在我的窗口中有一个NSTextView,它的子类HDLTextView及其超类NSTextView被子类化。但是实现的委托textShouldBeginEditing没有被调用,尽管NSTextView作为NSText的子类支持这个委托。
那么为什么委托使用NSTextField但不能使用NSTextView?
@implementation HDLTextView
- (BOOL)textShouldBeginEditing:(NSText *)textObject
{
DLog(@"huu");
if ([[[self window] windowController] recordShouldEdit]) {
[[[self window] windowController] sendDocumentEdited];
return YES;
}
return NO;
}
- (void) setItDisabled: (NSNotification *) notification
{
[self setEditable:NO];
[self setBackgroundColor:[NSColor controlColor]];
}
- (void) setItEnabled: (NSNotification *) notification
{
[self setEditable:YES];
[self setBackgroundColor:[NSColor controlBackgroundColor]];
}
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
- (void) awakeFromNib
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setItDisabled:)
name:@"HDLRecordLockedByOtherUser"
object:[[self window] windowController]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setItEnabled:)
name:@"HDLRecordReleased"
object:[[self window] windowController]];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"HDLRecordLockedByOtherUser" object:[[self window] windowController]];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"HDLRecordReleased" object:[[self window] windowController]];
[super dealloc];
}
非常感谢任何帮助。
顺便说一句 - 当我把这个应用程序写成新手时,stackoverflow给了我所有我想要的答案。所以,非常感谢大家。
答案 0 :(得分:1)
Apple提供此overview of delegation。
根据NSTextField文档,其textShouldBeginEditing:
方法请求开始编辑文本对象的权限。这是不是委托方法 - 它是NSTextField的一个子类可以实现的方法。
要使用委托,您需要创建一个实现NSTextFieldDelegate
协议的不同对象,实现control:textShouldBeginEditing:方法,并将其设置为文本字段的委托。您可以通过连接插座或在文本字段上调用setDelegate
来执行此操作。
NSTextView没有textShouldBeginEditing:
方法。
因此,请尝试将NSTextView的委托出口连接到自身。
或者,按照预期使用委托模式:
将您的类重命名为HDLTextViewController,子类NSObject,并实现NSTextViewDelegate
协议。
@interface HDLTextViewController : NSObject <NSTextViewDelegate>