NSTextField持续更新

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)

Jos*_*ell 7

使您的控制器成为文本字段的委托 ; 您可以在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方法本身一样.