委托textShouldBeginEditing不在NSTextView的子类中调用

时间:2011-10-04 21:08:11

标签: cocoa

我正在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给了我所有我想要的答案。所以,非常感谢大家。

1 个答案:

答案 0 :(得分:1)

Apple提供此overview of delegation

根据NSTextField文档,其textShouldBeginEditing:方法请求开始编辑文本对象的权限。这是不是委托方法 - 它是NSTextField的一个子类可以实现的方法。

要使用委托,您需要创建一个实现NSTextFieldDelegate协议的不同对象,实现control:textShouldBeginEditing:方法,并将其设置为文本字段的委托。您可以通过连接插座或在文本字段上调用setDelegate来执行此操作。

NSTextView没有textShouldBeginEditing:方法。

因此,请尝试将NSTextView的委托出口连接到自身。

或者,按照预期使用委托模式:

  1. 将您的类重命名为HDLTextViewController,子类NSObject,并实现NSTextViewDelegate协议。

    @interface HDLTextViewController : NSObject <NSTextViewDelegate>   
    
  2. 在该课程中,实施父协议的textShouldBeginEditing:方法。
  3. 在nib中,插入一个NSObject并将自定义类设置为HDLTextViewController。
  4. 将HDLTextView替换为标准NSTextView,并将其委托插座连接到新的控制器对象。