在`controlTextDidChange`方法中使用自定义NSFormatter访问NSTextField的`stringValue`使其不可编辑。

时间:2017-12-27 18:26:17

标签: objective-c cocoa nstextfield nsformatter

我有一个自定义NSFormatter用于文本字段,如here& here。我也有此文本域的委托,我从委托方法stringValue访问controlTextDidChange:。使用此代码,当我尝试编辑文本字段时,它会不断地从NSFormatter重置它的值并使其不可编辑。

CustomFormatter.m

 @implementation CustomFormatter

- (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString  **)error {
    float floatResult;
    NSScanner *scanner;
    BOOL returnValue = NO;

    scanner = [NSScanner scannerWithString: string];
    [scanner scanString: @"$" intoString: NULL]; // ignore  return value
    if ([scanner scanFloat:&floatResult] && ([scanner isAtEnd])) {
        returnValue = YES;
        if (obj) {
            *obj = [NSNumber numberWithFloat:floatResult];
        }
    } else {
        if (error) {
            *error = NSLocalizedString(@"Couldn’t convert  to float", @"Error converting");
        }
    }
    return returnValue;
}

- (NSString *)stringForObjectValue:(id)anObject {

    if (![anObject isKindOfClass:[NSNumber class]]) {
        return nil;
    }
    return [NSString stringWithFormat:@"$%.2f", [anObject  floatValue]];
}

@end

MyDelegate.m

@interface MyController () <NSTextFieldDelegate>
@property (weak) IBOutlet NSTextField *text1;    
@end

@implementation MyController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do view setup here.
}

- (void)controlTextDidChange:(NSNotification *)obj {
    NSLog(@"%@",[self.text1 stringValue]);
}
@end

1 个答案:

答案 0 :(得分:0)

您可以从field editor获取字符串NSTextView。您可以从通知的userinfo获取字段编辑器。

  

controlTextDidChange

     

当控件(如文本字段或表单)中的文本发生更改时,将调用此方法。控件发布textDidChangeNotification通知,如果控件的委托实现此方法,则会自动注册以接收通知。使用密钥@“NSFieldEditor”从通知对象的userInfo字典中获取字段编辑器。