テンキーキーボードで入力したいテキストフィールドがあります。最初はテキストフィールドを00.00のようにして、ユーザーが入力を開始すると、左から右、または右から左に更新します。たとえば、2 の後に 3 を入力すると、テキストフィールドは 23.00 のようになり、ユーザーは小数点以下 2 桁までの数字を入力できるようになります。どうすればこの機能を取得できますか??
ありがとうございます。
乾杯、シアバッシュ
の.h
@property (assign, nonatomic) int maximumFractionDigits;
@property (strong, nonatomic) NSString* decimalSeparator;
これを入れloadView
たり、viewDidLoad
NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setCurrencyCode:@"GBP"];
self.maximumFractionDigits = numberFormatter.maximumFractionDigits;
self.decimalSeparator = numberFormatter.decimalSeparator;
[numberFormatter release];
UITextFieldDelegate
メソッドで
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string {
// get current cursor position
UITextRange* selectedRange = [textField selectedTextRange];
UITextPosition* start = textField.beginningOfDocument;
NSInteger cursorOffset = [textField offsetFromPosition:start toPosition:selectedRange.start];
// Update the string in the text input
NSMutableString* currentString = [NSMutableString stringWithString:textField.text];
NSUInteger currentLength = currentString.length;
[currentString replaceCharactersInRange:range withString:string];
// Strip out the decimal separator
[currentString replaceOccurrencesOfString:self.decimalSeparator withString:@"" options:NSLiteralSearch range:NSMakeRange(0, [currentString length])];
// Generate a new string for the text input
int currentValue = [currentString intValue];
NSString* format = [NSString stringWithFormat:@"%%.%df", self.maximumFractionDigits];
double minorUnitsPerMajor = pow(10, self.maximumFractionDigits);
NSString* newString = [NSString stringWithFormat:format, currentValue / minorUnitsPerMajor];
textField.text = newString;
// if the cursor was not at the end of the string being entered, restore cursor position
if (cursorOffset != currentLength) {
int lengthDelta = newString.length - currentLength;
int newCursorOffset = MAX(0, MIN(newString.length, cursorOffset + lengthDelta));
UITextPosition* newPosition = [textField positionFromPosition:textField.beginningOfDocument offset:newCursorOffset];
UITextRange* newRange = [textField textRangeFromPosition:newPosition toPosition:newPosition];
[textField setSelectedTextRange:newRange];
}
return NO;
}
以下のデリゲートメソッドを使用できます。必要に応じて変更してください。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString *replacedSting = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSArray *noOfDigits = [replacedSting componentsSeparatedByString:@"."];
if([noOfDigits count]>=2)
{
NSString *sepStr=[NSString stringWithFormat:@"%@",[noOfDigits objectAtIndex:1]];
return !([sepStr length]>1);
}
return YES;
}
1 桁の前に 10 桁を設定しようとしている場合、これはちょっとしたハックですが、うまくいくと思います。UITextField のデリゲート メソッドのようなものを使用できます
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
テキスト フィールドのデリゲートを設定したことを確認してから、このメソッドを使用してください。キーストロークごとにどのインデックスを変更するかを把握するために、カウンターを自分で保持できます。範囲を無視して、追跡している範囲に自分で変更します。たとえば、インデックス 0 から開始し、メソッドが呼び出されるたびにインクリメントしますが、ボタンが押されない状態が X 秒間続くと、最初のインデックスにリセットされます。
それ以外の場合は、ラムの答えがうまくいくはずです!