在 Interface Builder 中,我创建了一个文本字段并将一个 NSNumberFormatter 粘贴到单元格中。但是,用户仍然可以在文本字段中键入文本。有没有办法仅使用界面生成器将输入限制为数字?我认为这就是 NSNumberFormatter 的重点。
问问题
2592 次
2 回答
0
创建一个 NSNumberFormatter 子类并将其放入实现中。在您的代码中,将 YKKNumberFormatter 设置为 NSTextField/UITextField 的格式化程序。
@implementation YKKNumberFormatter
- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error {
// Make sure we clear newString and error to ensure old values aren't being used
if (newString) { *newString = nil;}
if (error) {*error = nil;}
static NSCharacterSet *nonDecimalCharacters = nil;
if (nonDecimalCharacters == nil) {
nonDecimalCharacters = [[[NSCharacterSet decimalDigitCharacterSet] invertedSet] retain];
}
if ([partialString length] == 0) {
return YES; // The empty string is okay (the user might just be deleting everything and starting over)
} else if ([partialString rangeOfCharacterFromSet:nonDecimalCharacters].location != NSNotFound) {
return NO; // Non-decimal characters aren't cool!
}
return YES;
}
@end
于 2012-11-21T20:11:56.737 回答
0
每个格式化程序都有这个方法:
- (BOOL) getObjectValue: (id*) object forString: (NSString*) string
errorDescription: (NSError**) error;
这对每个格式化程序都有效。
如果字符串无效,则返回 false,并且作为参数(取消引用)传递的对象将为 nil。
因此,不要将数字格式化程序放到文本字段中,而是使用您自己的格式化程序作为实例变量。观察实现委托协议的文本字段,以便在每次更改文本时都可以通知您。
然后调用这个方法:
NSNumber* number;
BOOL success=[formatter getObjectValue: &number forString: [myTextField stringValue] errorDescription:nil];
此时如果success为假(或检查number是否为nil),则文本字段中存在无效字符串,因此请执行更适合您的操作(可能删除整个字符串,或显示0.0作为值)。
还有另一种方法:
- (BOOL) isPartialStringValid : (NSString*) partialString: (NSString*) partialString
errorDescription: (NSString*) error;
这样你就可以知道部分字符串是否有效。例如,科学记数法“1e”无效,但部分有效,因为用户可以加1,它将变为“1e1”。
于 2012-11-21T18:43:31.810 回答