我正在尝试制作一个简单的 Cocoa 应用程序,其中将数字输入到文本字段中。当在一个文本字段中输入数字时,另一个文本字段将自动更新为另一个数字(反之亦然)。我拖到窗口中的文本字段是界面生成器中的“带有数字格式化程序的文本字段”。我将文本字段设置为委托(delegate),允许它们自动更新。但是,格式化似乎不起作用。我无法输入小数。请帮忙!!!
头文件在这里:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSTextField *number1;
IBOutlet NSTextField *number2;
}
@property (assign) IBOutlet NSWindow *window;
@end
这里的实现文件:
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
-(void)controlTextDidChange:(NSNotification *) note {
NSTextField *changedField = [note object];
if (changedField == number1) {
float num1 = [number1 floatValue];
[number2 setFloatValue: (num1*2.0)];
}
if (changedField == number2) {
float num2 = [number2 floatValue];
[number1 setFloatValue: (num2/2.0)];
}
}
@end
最佳答案
这有点晦涩,但是您尝试做的事情实际上无法正常工作,但还有另一种选择。
在您的代码中:
float num1 = [number1 floatValue];
[number2 setFloatValue: (num1*2.0)];
第一行请求 number1
的当前值。由于您在 number1
上附加了一个数字格式化程序,因此会调用它来格式化文本...如果您输入了 123。
此时格式化的结果是123
...并且你的小数点消失了。您会注意到您也不能输入逗号(千位分隔符)。
因此,根本问题是,在输入每个字符后,您的代码会强制其成为此时的有效数字。
另一种方法是仅在用户输入完整数字时才执行操作。您可以自己编写代码来在键入每个字符时分析输入,也可以使用快速而简单的方法等待用户点击并响应操作。
要执行后者,请将代码更改为:
- (IBAction) textDidChange:(id)sender
{
if (sender == number1)
{
float num1 = [number1 floatValue];
[number2 setFloatValue: (num1*2.0)];
}
else if (sender == number2)
{
float num2 = [number2 floatValue];
[number1 setFloatValue: (num2/2.0)];
}
}
并将其作为“选择器”连接到控件,并删除已有的“委托(delegate)”连接。
此解决方案不如您尝试的“动态”,但它确实有效。要获得动态响应,您需要编写更多涉及的代码,如上所述。
关于objective-c - 带有数字格式化程序的 NSTextField 不允许小数输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9024318/