0

我想创建一个自定义 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。

谢谢

尼古拉

4

1 回答 1

0

像往常一样在您的自定义中实施UITextFieldDelegate方法。UITextField

然后,您可以为委托创建一个代理,将外部调用者引用到 ViewController 设置的委托

覆盖@property id<UITextfieldDelegate>以返回 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:ViewController只有在可以更改文本的情况下,代表才有发言权)

protip:当您转发委托方法时,请确保它们通过检查来实现它们respondsToSelector:,并确保委托是非nil

于 2013-04-11T22:55:50.517 回答