wig*_*ing 4 macos cocoa objective-c nstextfield
我无法弄清楚如何NSTextfield自动更新,而无需按"返回"或单击其他文本字段.
我的目标是在一个字段中输入一个数字,同时更新其他字段.我尝试在文本字段属性中单击"连续"但它似乎没有做任何事情.
这是我的界面文件:
#import <Foundation/Foundation.h>
@interface InchController : NSObject {
IBOutlet NSTextField *centimetersTextField;
IBOutlet NSTextField *inchesTextField;
IBOutlet NSTextField *feetTextField;
}
-(IBAction)convert:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
这是我的实现文件:
#import "InchController.h"
@implementation InchController
- (IBAction)convert:(id)sender {
if (sender == inchesTextField) {
float inches = [inchesTextField floatValue];
[feetTextField setFloatValue:(inches * 0.0833)];
[centimetersTextField setFloatValue:(inches * 2.54)];
}
else if (sender == feetTextField) {
float feet = [feetTextField floatValue];
[inchesTextField setFloatValue:(feet * 12)];
[centimetersTextField setFloatValue:(feet * 30.48)];
}
else if (sender == centimetersTextField) {
float centimeters = [centimetersTextField floatValue];
[inchesTextField setFloatValue:(centimeters * 0.394)];
[feetTextField setFloatValue:(centimeters * 0.033)];
}
}
@end
Run Code Online (Sandbox Code Playgroud)
所以这是根据Josh的解决方案更新的实现文件.注释掉IBAction,因为实现和接口文件不再需要它.
#import "LengthController.h"
@implementation LengthController
//- (IBAction) convert: (id)sender {
//}
-(void) controlTextDidChange:(NSNotification *) note {
NSTextField *changedField = [note object];
if (changedField == inchesTextField) {
float inches = [inchesTextField floatValue];
[feetTextField setFloatValue: (inches * 0.0833)];
[centimetersTextField setFloatValue: (inches * 2.54)];
}
if (changedField == centimetersTextField) {
float centimeters = [centimetersTextField floatValue];
[inchesTextField setFloatValue:(centimeters * 0.394)];
[feetTextField setFloatValue:(centimeters * 0.033)];
}
if (changedField == feetTextField) {
float feet = [feetTextField floatValue];
[inchesTextField setFloatValue:(feet * 12)];
[centimetersTextField setFloatValue:(feet * 30.48)];
}
}
@end
Run Code Online (Sandbox Code Playgroud)
使您的控制器成为文本字段的委托 ; 您可以在Interface Builder中通过Ctrl键从文本字段拖动到控制器来设置它.
在你的控制器中,实现" NSControl委托"方法controlTextDidChange:,只要字段的文本发生变化,就会调用它(顾名思义).在该方法中,您可以验证文本,并在适当的情况下更新其他字段的内容.
传入的参数可以为您提供更改的文本字段; 然后,您可以将其传递给现有convert:方法以重用代码:
- (void) controlTextDidChange: (NSNotification *)note {
NSTextField * changedField = [note object];
[self convert:changedField];
}
Run Code Online (Sandbox Code Playgroud)
动作方法没什么特别之处.在IBAction返回类型的计算结果为void; 它仅被Xcode用于公开在Interface Builder中使用的方法.因此,您可以像任何其他方法一样调用它们.在这里,您将获得相应的字段并将其作为sender参数传递,就好像该字段已调用了action方法本身一样.
| 归档时间: |
|
| 查看次数: |
4534 次 |
| 最近记录: |