objective-c - NSTextField - 使用 KVO 输入验证?

标签 objective-c macos cocoa

我的应用程序中有一个 NSTextField,当用户给我一些错误的输入时,我想更新输入。

此外,我已将此文本字段控件的值绑定(bind)到成员变量。我提取了一个最小的项目:

enter image description here

这是绑定(bind):

enter image description here

一切都很简单,最后在代码中我将初始值设置为 Hello, World,并且我还实现了 中的 controlTextDidChange: 方法NSControlTextEditingDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    self.text = @"Hello, World";
}

- (void)controlTextDidChange:(NSNotification *)obj
{
    NSLog(@"Changed Value: %@", [[obj object] stringValue]);
    self.text = @"What??";
}

当我开始在文本字段中输入内容时,我确实收到了更改通知,但文本字段中的值未更新。我想知道为什么以及如何通过更改 self.text 来更新文本字段中的文本值。

PS:我知道我可以通过添加该文本字段的 outlet 并手动设置 stringValue 来实现此目的,但我不想这样做。因为它打破了低耦合规则,对吗?

最佳答案

为了使绑定(bind)自动验证值,有Key-Value Validation机制.

  1. 在您绑定(bind)到的对象(应用程序委托(delegate))中实现以下方法之一:

    - (BOOL) validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
    - (BOOL) validateText:(inout id *)ioValue error:(out NSError **)outError;
    

    第一个是通用的,将被所有键调用,第二个将专门为键text调用。

  2. 启用“立即验证”复选框。

如果验证方法返回NO,将显示一个标准错误表,其中包含将值恢复到编辑前的值的选项,以及继续编辑而不在模型对象中设置值的选项(应用程序代理)。

关于objective-c - NSTextField - 使用 KVO 输入验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24647596/

相关文章:

macos - 升级到 Xcode 4.2 后,Organizer - SVN 存储库停止工作

cocoa - 如何判断 cocoa webview 何时更新

macos - ffmpeg 错误 : Could not write header for output file #0 (incorrect codec parameters ?):找不到 Muxer

objective-c - Facebook sdk 框架未找到 ios7,xcode5

objective-c - 运行代码返回垃圾;在调试器中输入会返回正确的结果

ios - 在 iOS 应用程序中实现 MVC 模式的正确方法是什么?

c - 在 Mavericks (OS X 10.9) 上开发 PostgreSQL

objective-c - 如何在启动时在 Cocoa 应用程序中打开一个新窗口

macos - NSAnimation 删除按钮背景颜色

iphone - 表没有得到刷新