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

标签 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;

}

最佳答案

我建议一个稍微不同的解决方案,在文本字段上使用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;

}

此代码仍然可以进行一些改进,但它应该可以帮助您入门。

关于ios - 当我将 UITextField 与 resignFirstResponder 结合使用时,它最多不是 1 个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969632/

相关文章:

ios - Swift - 如何正确使用委托(delegate)

ios - SKVideoNode 不显示视频

iphone - 执行错误访问 NSString

ios - iOS7 上的 UITextfield leftView/rightView 填充

ios - 在文本字段中复制/粘贴光标语言

ios - WKWebView loadRequest 失败时加载自定义错误htmlString

ios - 如何解决这个编译错误?

ios - 使用 Core Data 从 NSMutableArray 创建对象的 NSString

iphone - 如何截取 NSString 的部分内容?

ios - IOS7 上的 Tableview 字幕