如何正确使用NSTextField的委派

时间:2014-02-20 16:23:48

标签: objective-c macos nstextfield

我正在尝试为 NSTextField 对象实现委托,以便我可以实时检测用户输入并提供有关该特定字段中不允许输入的一些反馈。  特别是,我想从JavaScript模拟onChange()方法,实时检测用户输入,并在写入不受支持的值时向他显示警告。

即。该应用程序有一个文本字段,它只接受0到255之间的数值(如RGB值),我想知道用户何时写入不是数值或超出范围值,以立即显示警告消息或更改文本字段背景颜色,只是一个视觉提示,让他知道输入是错误的。

enter image description here enter image description here

就像你在上面的图片上看到的那样,每次用户在文本字段中输入禁止值时,我都想显示一个警告标志。

我一直在阅读很多Apple's documentation,但我不明白要实施哪个代表(NSTextFieldDelegateNSTextDelegateNSTextViewDelegate),我也是不知道如何在我的AppDelegate.m文件中实现它以及使用哪种方法以及如何获取用户编辑的通知。

现在,我已经在我的init方法中使用类似[self.textField setDelegate:self];的方式设置了委托,但我不明白如何使用它或使用哪种方法。

2 个答案:

答案 0 :(得分:8)

我使用此问题中发布的信息找到了解决方案...... Listen to a value change of my text field

首先,我必须在AppDelegate.h文件中声明NSTextFieldDelegate

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTextFieldDelegate>

之后,当用户在AppDelegate.m文件中更新它时,我必须实例化我要修改的NSTextField对象的委托。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self.textField setDelegate:self];
}

最后,我实现了使用我想要设置的更改来检测字段编辑的方法。

- (void)controlTextDidChange:(NSNotification *)notification {
    NSTextField *textField = [notification object];
    if ([textField doubleValue] < 0 | [textField doubleValue] > 255) {
        textField.textColor = [NSColor redColor];
    }
}

- (void)controlTextDidEndEditing:(NSNotification *)notification {
    NSTextField *textField = [notification object];
    if ([textField resignFirstResponder]) {
        textField.textColor = [NSColor blackColor];
    }
}

答案 1 :(得分:1)

使您的班级符合NSTextFieldDelegate协议。它需要成为该协议,因为在documentation中它表示委托符合的协议类型。

@interface MyClass:NSObject

实现委托的方法(只需将它们添加到您的代码中)。实施例

- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor
{
}

编辑:

我认为在你的情况下,最好替换TextView的TextField并使用NSTextViewDelegate,在委托中,你最多的方法应该是

- (BOOL)textView:(NSTextView *)aTextView shouldChangeTextInRange:(NSRange)affectedCharRange replacementString:(NSString *)replacementString
{
    BOOL isValid = ... // Check here if replacementString is valid (only digits, ...)
    return isValid; // If you return false, the user edition is cancelled
}