Ios 具有最大十进制数的自定义UITextField
我想使用以下内容创建自定义UITextField: 1) 只允许一个小数点。 2) 用户可以输入的最大小数位数(将是一个属性),例如2 我最好的办法是什么 我创建了一个从UITextField继承的新类 对于我在stackoverflow上发现的点#1,我应采用以下方法:Ios 具有最大十进制数的自定义UITextField,ios,objective-c,uitextfield,custom-controls,Ios,Objective C,Uitextfield,Custom Controls,我想使用以下内容创建自定义UITextField: 1) 只允许一个小数点。 2) 用户可以输入的最大小数位数(将是一个属性),例如2 我最好的办法是什么 我创建了一个从UITextField继承的新类 对于我在stackoverflow上发现的点#1,我应采用以下方法: -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSStrin
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Implementing it like this:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSArray *sep = [newString componentsSeparatedByString:@"."];
if([sep count]>=2)
{
NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
return !([sepStr length]>1);
}
return YES;
}
第一个问题是,这是UITextField委托的方法,对于从UITextField继承的新对象不可用。我希望我的自定义UITextField在默认情况下实现它,但是
没有这样的方法
第二个问题是十进制分隔符可以是“.”或“,”。有没有办法找到键盘的小数点分隔符
对于点#2,用户可以输入的最大十进制数,我想我应该检查十进制分隔符后是否已经有2位数字,如果是,我将不修改UItextField.text
谢谢
Nicola在自定义的
UITextField
中正常执行UITextField委托
方法
然后,您可以为委托创建代理,该代理将外部调用方引用到由ViewController设置的委托
重写@property id
,以返回ViewController设置的委托
在UITextField
子类中实现:
(id) init {
self = [super init];
if (self) {
//register ourselves as the delegate with UITextField
super.delegate = self;
//custom initialization code
}
return self;
}
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSArray *sep = [newString componentsSeparatedByString:@"."];
if([sep count]>=2)
{
NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
BOOL ret = !([sepStr length]>1);
if(ret)
return [_delegate textfield:textField shouldChangeCharactersInRange:range replacementString:string];
return return NO;
}
return [_delegate textfield:textField shouldChangeCharactersInRange:range replacementString:string];
}
基本上,如果委托方法有发言权,请确保将其转发给ViewController
。(对于shouldChangeCharactersInRange:
,如果可以更改文本,则视图控制器
代理仅获得发言权)
protip:转发委托方法时,请确保它们通过使用
respondsToSelector:
进行检查来实现,并确保委托为非nil
是否可以在自定义UITextField
中实现UITextField委托
?问题是控制器必须将自身设置为委托,因为它必须实现其他方法。