当我将它与resignFirstResponder结合使用时,UITextField不是最多1个数字

时间:2014-05-31 11:41:16

标签: ios objective-c uitextfield uitextviewdelegate

检查最大数字是否为1的代码在我只使用那段代码时起作用。但是当我使用[becomFirstResponder]将自动跳转添加到下一个UITextField时,它不再起作用了。

非常感谢你们!

enter image description here enter image description here enter image description here

何时

MyViewController.h

@interface GateKeeperViewController : UIViewController <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UITextField *firstCodeField;
@property (strong, nonatomic) IBOutlet UITextField *secondCodeField;
@property (strong, nonatomic) IBOutlet UITextField *thirdCodeField;
@property (strong, nonatomic) IBOutlet UITextField *fourthCodeField;
@property (strong, nonatomic) IBOutlet UITextField *fifthCodeField;

MyViewController.m

@synthesize firstCodeField;
@synthesize secondCodeField;
@synthesize thirdCodeField;
@synthesize fourthCodeField;
@synthesize fifthCodeField;

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self initFieldListeners];
}

-(void) initFieldListeners {

    firstCodeField.delegate = self;
    secondCodeField.delegate = self;
    thirdCodeField.delegate = self;
    fourthCodeField.delegate = self;
    fifthCodeField.delegate = self;

    [self.firstCodeField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];

    [self.secondCodeField addTarget:self
                             action:@selector(textFieldEditing:)
                   forControlEvents:UIControlEventEditingChanged];

    [self.thirdCodeField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];

    [self.fourthCodeField addTarget:self
                             action:@selector(textFieldEditing:)
                   forControlEvents:UIControlEventEditingChanged];

    [self.fifthCodeField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];
}

- (void)textFieldEditing:(UITextField *)textField
{
    if(textField == self.firstCodeField ){
        if ([self.firstCodeField.text length] == 1) {
            [self.secondCodeField becomeFirstResponder];
        }
    }

    if(textField == self.secondCodeField ){
        if ([self.secondCodeField.text length] == 1) {
            [self.thirdCodeField becomeFirstResponder];
        }
    }

    if(textField == self.thirdCodeField ){
        if ([self.thirdCodeField.text length] == 1) {
            [self.fourthCodeField becomeFirstResponder];
        }
    }

    if(textField == self.fourthCodeField ){
        if ([self.fourthCodeField.text length] == 1) {
            [self.fifthCodeField becomeFirstResponder];
        }
    }
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 1) ? NO : YES;

}

3 个答案:

答案 0 :(得分:2)

我建议使用略有不同的解决方案,在文本字段中使用target-action以获取编辑事件的通知。我们的想法是在shouldChangeCharactersInRange方法之后执行您的操作。例如,使用3个文本字段:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.firstTextField addTarget:self
                            action:@selector(textFieldEditing:)
                  forControlEvents:UIControlEventEditingChanged];

    [self.secondTextField addTarget:self
                             action:@selector(textFieldEditing:)
                   forControlEvents:UIControlEventEditingChanged];

}

- (void)textFieldEditing:(UITextField *)textField
{
    if(textField == self.firstTextField ){
        if ([self.firstTextField.text length] == 1) {
            [self.secondTextField becomeFirstResponder];
        }
    }

    if(textField == self.secondTextField ){
        if ([self.secondTextField.text length] == 1) {
            [self.thirdTextField becomeFirstResponder];
        }
    }
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 1) ? NO : YES;

}

可以对此代码进行一些改进,但它应该让您入门。

答案 1 :(得分:1)

shouldChangeCharactersInRange委托获得行动之前设置值。

意思是,您需要删除setText

答案 2 :(得分:0)

删除你的 - setText:方法并按照这样做

创建一个局部变量以保留最后一个NSString和当前UITextField的引用

[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(giveText:) userInfo:nil repeats:NO]; // instead of your - setText:

- (void)giveText:(id)sender {

    // set your text here lets say

    [currentTextField setText:lastString];
}

你必须在return语句之后设置文本,但这是不可能的,所以你滥用NSTimer来做到这一点。

示例:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    _lastString = string;
    _currentTextField = textField;

    if(firstCodeField == textField){

        // [firstCodeField setText:newString];

        [secondCodeField becomeFirstResponder];
    }

    // ...... other ifs

    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(giveText:) userInfo:nil repeats:NO];
}