Interface builder 上的 Custom Formatter 的目的是什么?
What is the purpose of the Custom Formatter on Interface builder?
界面生成器有这个自定义格式化程序,可以拖到文本字段。
但是这个东西根本没有任何属性,而且 Apple 的典型文档是 non-existent。
我需要创建一个格式化程序,它可以接受数字、字母数字集中的文本和下划线,并拒绝其他所有内容。
我怀疑这个 Custom Formatter 是我需要的,但我该如何使用它?或者是否可以使用界面构建器上存在的常规格式化程序来做我需要的事情?
你能举个使用界面生成器的例子吗?
谢谢。
该对象对 OS X 最有用。在 OS X 上,您可以将格式化程序附加到 controls/cells。在 iOS 中,我想您可以将格式化程序添加到 NIB 或情节提要并为其连接一个插座,但与以编程方式创建它相比,这并没有太多优势。
特别是,当您想添加 NSFormatter
的自定义子 class 的实例时,通用自定义格式器适用。您将 Custom Formatter 拖入相关 control/cell,然后在 Identity inspector 中设置其 class。
如果该对象在对象库中不可用,您只能拖入特定格式化程序 classes(例如 NSNumberFormatter
)的实例。您可以设置结果实例的 class,但只能设置为该特定格式化程序 class.
的子 class
如果您需要学习如何编写自定义格式化程序 class,请参阅 NSFormatter
的 class 参考和 Data Formatting Guide.
NSFormatter class 是一个抽象class,因此您需要对其进行子class。为此,您需要实现以下方法。
- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error;
- (NSString *)stringForObjectValue:(id)obj;
- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error;
创建子class喜欢:
.h
@interface MyFormatter : NSFormatter
@end
.m
@implementation MyFormatter
- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error
{
// In this method you need to write the validation
// Here I'm checking whether the first character entered in the textfield is 'a' if yes, It's invalid in my case.
if ([partialString isEqualToString:@"a"])
{
NSLog(@"not valid");
return false;
}
return YES;
}
- (NSString *)stringForObjectValue:(id)obj
{
// Here you return the initial value for the object
return @"Midhun";
}
- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error
{
// In this method we can parse the string and pass it's value (Currently all built in formatters won't support so they just return NO, so we are doing the same here. If you are interested to do any parsing on the string you can do that here and pass YES after a successful parsing
// You can read More on that here: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFormatter_Class/index.html#//apple_ref/occ/instm/NSFormatter/getObjectValue:forString:errorDescription:
return NO;
}
@end
界面生成器有这个自定义格式化程序,可以拖到文本字段。
但是这个东西根本没有任何属性,而且 Apple 的典型文档是 non-existent。
我需要创建一个格式化程序,它可以接受数字、字母数字集中的文本和下划线,并拒绝其他所有内容。
我怀疑这个 Custom Formatter 是我需要的,但我该如何使用它?或者是否可以使用界面构建器上存在的常规格式化程序来做我需要的事情?
你能举个使用界面生成器的例子吗?
谢谢。
该对象对 OS X 最有用。在 OS X 上,您可以将格式化程序附加到 controls/cells。在 iOS 中,我想您可以将格式化程序添加到 NIB 或情节提要并为其连接一个插座,但与以编程方式创建它相比,这并没有太多优势。
特别是,当您想添加 NSFormatter
的自定义子 class 的实例时,通用自定义格式器适用。您将 Custom Formatter 拖入相关 control/cell,然后在 Identity inspector 中设置其 class。
如果该对象在对象库中不可用,您只能拖入特定格式化程序 classes(例如 NSNumberFormatter
)的实例。您可以设置结果实例的 class,但只能设置为该特定格式化程序 class.
如果您需要学习如何编写自定义格式化程序 class,请参阅 NSFormatter
的 class 参考和 Data Formatting Guide.
NSFormatter class 是一个抽象class,因此您需要对其进行子class。为此,您需要实现以下方法。
- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error;
- (NSString *)stringForObjectValue:(id)obj;
- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error;
创建子class喜欢:
.h
@interface MyFormatter : NSFormatter
@end
.m
@implementation MyFormatter
- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error
{
// In this method you need to write the validation
// Here I'm checking whether the first character entered in the textfield is 'a' if yes, It's invalid in my case.
if ([partialString isEqualToString:@"a"])
{
NSLog(@"not valid");
return false;
}
return YES;
}
- (NSString *)stringForObjectValue:(id)obj
{
// Here you return the initial value for the object
return @"Midhun";
}
- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error
{
// In this method we can parse the string and pass it's value (Currently all built in formatters won't support so they just return NO, so we are doing the same here. If you are interested to do any parsing on the string you can do that here and pass YES after a successful parsing
// You can read More on that here: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFormatter_Class/index.html#//apple_ref/occ/instm/NSFormatter/getObjectValue:forString:errorDescription:
return NO;
}
@end