多个UITextField进行组合,通过点击键盘上的return按键,可以以极好的用户体验给用户提供连贯的输入方式。
问题背景
我们常常需要在制作用户登录、注册等功能的时候,添加一连串UITextField文本框。在iOS键盘右下角则是一个换行键,通过点击这个键,用户可以完成确认、下一步等操作。
我们要达成的目标是用户点击第一个文本框输入数据后,点击换行键光标自动进入第二个文本框,当用户在最后一个文本框中点击换行键,自动提交表单。
快速实现
通过IB或代码,放置几个UITextField。
为每个UITextField**按顺序设置标志(tag)属性。
1 2 3 4 5
| [self.userIDTextField setTag:4]; [self.passwordTextField setTag:3]; [self.legionTextField setTag2]; [self.sexTextField setTag:1]; [self.birthTextField setTag:0];
|
tag是一个整形变量,用途是标记、区分、选择指定的视图(控件)。
在此设置tag属性是为了转换控件状态第一响应者的这时候能够通过tag方便地找到相应控件。
1 2 3 4 5
| self.userIDTextField.delegate = self; self.passwordTextField.delegate = self; self.legionTextField.delegate = self; self.sexTextField.delegate = self; self.birthTextField.delegate = self;
|
设置并实现代理,UITextFieldDelegate。
1
| - (BOOL)textFieldShouldReturn:(UITextField *)textFeld;
|
在这个回调方法中,我们要保证第0个到倒数第2个UITextField是第一响应者的时候,用户点击return后,第一响应者都变为紧跟其后的UITextField。
切换第一响应者的方法是让目前的第一响应者放弃其第一响应者身份,让下一个目标控件成为第一响应者,即:
1 2
| [textField0 resignFirstResponder]; [textField1 becomeFirstRespondr];
|
所以根据这个逻辑,我们可以明确我们实现这个功能的方法了。通过tag属性找到所需要的控件,如果他不是最后一个控件,那么设置其放弃第一响应者,并使其临近的下一个控件成为第一响应者。最后一个控件回调中实现提交功能。
我们在样例中把0tag给了最后一个控件,那么我们即可在switch中,只通过case 0的情况,实现最后一个控件点击return提交,其余控件在default情况中实现即可了。
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| - (BOOL)textFieldShouldReturn:(UITextField *)textField { switch (textField.tag) { case 0: [textField resignFirstResponder]; [self submitBTN:self.loginBTN]; break; default: [textField resignFirstResponder]; [(UITextField *)[self.view viewWithTag:textField.tag-1] becomeFirstResponder]; break; } return YES; }
|