【问题标题】:Accessing `stringValue` of a NSTextField with custom NSFormatter, in `controlTextDidChange` method makes it non-editable.使用自定义 NSFormatter 访问 NSTextField 的 stringValue,在 `controlTextDidChange` 方法中使其不可编辑。
【发布时间】:2017-12-27 18:26:17
【问题描述】:

我有一个自定义 NSFormatter 用于文本字段,如 herehere 中所述。我也有这个文本字段的委托,我正在从委托方法controlTextDidChange: 访问stringValue。使用此代码,当我尝试编辑文本字段时,它会不断地从 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

【问题讨论】:

  • 您甚至没有正确使用 controlTextDidChange。
  • 你想对部分字符串做什么?您想在用户输入“900”时处理“9”吗?
  • @Willeke 假设我正在尝试在用户输入时过滤数据集,例如当用户输入“9”时,我想显示以 9 开头的结果集例如: 900。 @El Tomato 你是什么意思我没有使用controlTextDidChange correctly?请详细说明。

标签: objective-c cocoa nstextfield nsformatter


【解决方案1】:

您可以从field editorNSTextView 中获取字符串。您可以从通知的用户信息中获取字段编辑器。

controlTextDidChange

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多