问题
I have to handle navigate through multiple UITextFields using (Next / Done Button) and now I have to allow only one text/number in each UITextField how could we do that in UITextField as shown in image below
I have used following code recently and was able to achieve too but got problem that When I first enter the text/number in UITextField it is being entered in UITextField and when I enter the next text/number for second time it is being used only to push to next UITextField. I want to achieve is that when i enter the text/number for second time it must be pushed to next UITextField as well as value must be entered in next UITextField
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField.tag<10) {
if ((textField.text.length >= 1) && (string.length > 0))
{
NSInteger nextText = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
if (! nextResponder)
[textField resignFirstResponder];
// nextResponder = [textField.superview viewWithTag:1];
if (nextResponder){
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
return NO;
}
}
}
return YES;
}
I solve my problem using following code but I got a one more problem left. For the last UITextField i need it to resignFirstResponder immediately after it is filled up. But in current when it is fill up and user click next text then only resignFirstResponder is happening
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField.tag<10) {
if ((textField.text.length >= 1) && (string.length > 0))
{
NSInteger nextText = textField.tag + 1;
UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
if (! nextResponder)
[textField resignFirstResponder];
if (nextResponder){
[nextResponder becomeFirstResponder];
UITextField* nextTextfield= (UITextField*) [textField.superview viewWithTag:nextText];
if ((nextTextfield.text.length < 1)){
[nextTextfield setText:string];
}
return NO;
}
}
}
return YES;
}
回答1:
you can do this by using textfield delegate Method you can set tags to each text field in sequence like 1,2,3…. now in shouldChangeCharactersInRange
Method right logic that make next box to become first responder when you type one text/number in text box.
like given below
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ((textField.text.length >= 1) && (string.length > 0))
{
NSInteger nextText = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
if (! nextResponder)
nextResponder = [textField.superview viewWithTag:1];
if (nextResponder)
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
return NO;
}
return YES;
}
Edit:
If you want to Display enter text alos on jump of textfield you can add these lines after [nextResponder becomeFirstResponder]
add these lines given below
UITextField nextTextfield= (UITextField) [textField.superview viewWithTag:nextText];
[nextTextfield setText:string];
EDIT for resign responder for keyboard in last textfield.
If you want resign responder for last textfield
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField.tag<10) {
if ((textField.text.length >= 1) && (string.length > 0))
{
NSInteger nextText = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextText];
if (! nextResponder)
[textField resignFirstResponder];
// nextResponder = [textField.superview viewWithTag:1];
if (nextResponder){
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
UITextField *nextTextfield= (UITextField*) [textField.superview viewWithTag:nextText];
if (nextTextfield.text.length<1) {
if(nextTextfield.tag==4){
[nextTextfield setText:string];
[nextTextfield resignFirstResponder];
}else{
[nextTextfield setText:string];
}
}
return NO;
}
}
}
return YES;
}
This in this we check for last text tag here i check for 4 tag value u put ur last textfiedl tag in condition when u enter value for last textfield it will resign keyboard. hope this will help you.
回答2:
To enter only numbers in the your text field and to set length of the text field,try this:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// Check for non-numeric characters
NSUInteger lengthOfString = string.length;
for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {
unichar character = [string characterAtIndex:loopIndex];
if (character < 48) return NO; // 48 unichar for 0
if (character > 57) return NO; // 57 unichar for 9
}
// Check for total length
NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
if (proposedNewLength > 1) return NO; //set your length here
return YES;
}
回答3:
setting the text field's delegate and implementing the following delegate method:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// Prevent crashing undo bug – see note below.
if(range.length + range.location > textField.text.length)
{
return NO;
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 25) ? NO : YES;
}
Set the maximum character length of a UITextField
来源:https://stackoverflow.com/questions/29796503/how-can-i-enable-the-uitextfield-to-have-only-one-text-number-and-navigate-throu