我正在尝试制作一个简单的Cocoa应用程序,其中将数字输入到文本字段中。当在一个文本字段中键入数字时,另一个文本字段将自动更新为另一个数字(反之亦然)。我拖到窗口中的文本字段是界面生成器中的“带有数字格式化程序的文本字段”。我将文本字段设置为委托,这使它们可以自动更新。但是,格式化似乎不起作用。我无法输入十进制数字。请帮忙!!!
头文件在这里:
#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)];
}
}
并将其作为“选择器”连接到控件,并删除现有的“代理”连接。
该解决方案没有您尝试的那样“动态”,但确实有效。为了获得动态响应,您需要编写如上所述的更多相关代码。