gpt4 book ai didi

cocoa - 将 NSTextField 绑定(bind)到 NSNumber

转载 作者:行者123 更新时间:2023-12-03 16:10:19 24 4
gpt4 key购买 nike

我正在尝试使用 NSTextField 进行整数用户输入。文本字段绑定(bind)到 NSNumber 属性,在 setter 方法中,我清理输入值(确保它是 int)并在必要时设置该属性。我发送了 willChangeValueForKey: 和 didChangeValueForKey:,但当该文本字段仍处于事件状态时,UI 不会更新为新值。

例如,我可以在文本字段中输入“12abc”,setter 方法将其清理为“12”,但文本字段仍然显示“12abc”。

我在界面生成器中选中了“连续更新值”。

(我还注意到 setter 方法接收的是 NSString,而不是 NSNumber。这正常吗?)

将 NSTextField 连接到 NSNumber 的正确方法是什么?属性的 setter 方法是什么样的?如何防止非数字值出现在文本字段中?

最佳答案

I send the willChangeValueForKey: and didChangeValueForKey:, but the UI doesn't update to the new values while that text field is still active.

发送这些消息的理由很少。通常,通过实现和使用访问器(或者更好的是属性),您可以更好、更干净地完成相同的工作。当您执行此操作时,KVO 将为您发送通知。

就您而言,您想要拒绝或过滤虚假输入(例如“12abc”)。完成此任务的正确工具是键值验证。

要启用此功能,请选中 IB 中绑定(bind)上的“立即验证”框,并实现验证方法。

过滤:

- (BOOL) validateMyValue:(inout NSString **)newValue error:(out NSError **)outError {
NSString *salvagedNumericPart;
//Determine whether you can salvage a numeric part from the string; in your example, that would be “12”, chopping off the “abc”.
*newValue = salvagedNumericPart; //@"12"
return (salvagedNumericPart != nil);
}

拒绝:

- (BOOL) validateMyValue:(inout NSString **)newValue error:(out NSError **)outError {
BOOL isEntirelyNumeric;
//Determine whether the whole string (perhaps after stripping whitespace) is a number. If not, reject it outright.
if (isEntirelyNumeric) {
//The input was @"12", or it was @" 12 " or something and you stripped the whitespace from it, so *newValue is @"12".
return YES;
} else {
if (outError) {
*outError = [NSError errorWithDomain:NSCocoaErrorDomain code: NSKeyValueValidationError userInfo:nil];
}
//Note: No need to set *newValue here.
return NO;
}
}

(I've also noticed that the setter method receives an NSString, not an NSNumber. Is that normal?)

是的,除非您使用将字符串转换为数字的值转换器,请将数字格式化程序连接到 formatter socket ,或者在验证方法中用 NSNumber 替换 NSString。

关于cocoa - 将 NSTextField 绑定(bind)到 NSNumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com