Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有最大十进制数的自定义UITextField_Ios_Objective C_Uitextfield_Custom Controls - Fatal编程技术网

Ios 具有最大十进制数的自定义UITextField

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

我想使用以下内容创建自定义UITextField:

1) 只允许一个小数点。 2) 用户可以输入的最大小数位数(将是一个属性),例如2

我最好的办法是什么

我创建了一个从UITextField继承的新类

对于我在stackoverflow上发现的点#1,我应采用以下方法:

-(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委托
?问题是控制器必须将自身设置为委托,因为它必须实现其他方法。