2017-12-27 459 views
0

我对here & here中描述的文本字段具有自定义NSFormatter。我也有这个textfield的代表,并且我正从代表方法controlTextDidChange:访问stringValue。有了这段代码,当我尝试编辑文本字段时,它不断地从NSFormatter重置它的值,并使其不可编辑。在controlTextDidChange方法中使用自定义NSFormatter访问NSTextField的`stringValue`使其不可编辑。

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 
+0

你甚至没有正确使用controlTextDidChange。 –

+0

你想用部分字符串做什么?你想在用户输入“900”时处理“9”吗? – Willeke

+0

@Willeke让我们说我试图过滤一个数据集作为用户输入,例如当用户键入'9'我想显示一个以'9'开头的结果集例如:900。 @El番茄你是什么意思,我没有正确使用'controlTextDidChange'?请详细说明。 – cha77a

回答

0

你可以从field editor字符串,一个NSTextView。您可以从通知的用户信息中获取字段编辑器。

controlTextDidChange

被调用此方法时文本在控制如文本字段或形式的变化。控件发布了一个textDidChangeNotification通知,并且如果控件的委托实现此方法,它将自动注册以接收通知。使用键“NSFieldEditor”从通知对象的userInfo字典中获取字段编辑器。

相关问题