检查最大数字是否为1的代码在我只使用那段代码时起作用。但是当我使用[becomFirstResponder]将自动跳转添加到下一个UITextField时,它不再起作用了。
非常感谢你们!
何时
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;
}
答案 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];
}