0

次のコマンドでカスタムUITextFieldを作成したいと思います。

1)小数点は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については、小数点以下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 に答える