实现几个连续输入的textfield
2015-08-19 14:34
288 查看
如图所示,需要实现连续输入和删除的textfield
代码如下:
首先定义一个宏来实现过滤非法字符串,让输入的字符都是我定义的里面的字符。
#define kInputNumbers @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\n"
下面是定义的4个textfield
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField1;
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField2;
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField3;
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField4;
因为并没有直接可以调用的方法,所以要自己加上观察
[[NSNotificationCenter
defaultCenter]
addObserver:self
selector:@selector(textFieldTextDidChange:)
name:UITextFieldTextDidChangeNotification
object:nil];
/**
*
为了统一界面,在第一个field之前加上@“
”
*
* @param
textField
*/
- (void) textFieldDidBeginEditing:(UITextField
*)textField{
if (textField ==
_textField1 && !_isDelete) {
textField.text
=
@" ";
}
}
/**
*
对应的field改变之前调用这个方法,在这里面来控制从前面格子往后跳转
*
* @param
textField textField
* @param
range
传入的是改变之前光标所在的位置和长度,如果是删除的话是改变后光标的位置,长度为-1
* @param
string
改变的字符
*
* @return
YES的时候确认改变,NO的时候抛弃改变(可以用来过滤字符)
*/
- (BOOL)textField:(UITextField
*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString
*)string{
//过滤非法字符
NSCharacterSet *cs = [[NSCharacterSet
characterSetWithCharactersInString:kInputNumbers]
invertedSet];
NSString *filtered = [[string
componentsSeparatedByCharactersInSet:cs]
componentsJoinedByString:@""];
BOOL basicTest = [string
isEqualToString:filtered];
if (!basicTest) {
return
NO;
}
//确定是否是删除键
_isDelete = string.length
<=
0 ?
YES :
NO;
if (textField ==
_textField1) {
//这个方法确保手动点击某个textfield时可以实现跳到下一个
if (range.location
==
5) {
[textField
resignFirstResponder];
_textField2.enabled
=
YES;
[_textField2
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
if (range.location
==
0 &&
_isDelete)
{
return
NO;
}
}
else
if (textField ==
_textField2) {
if (range.location
==
5) {
[textField
resignFirstResponder];
_textField3.enabled
=
YES;
[_textField3
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
if (range.location
==
0 &&
_isDelete){
[textField
resignFirstResponder];
_textField1.enabled
=
YES;
[_textField1
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
}
else
if (textField ==
_textField3) {
if (range.location
==
5) {
[textField
resignFirstResponder];
_textField4.enabled
=
YES;
[_textField4
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
if (range.location
==
0 &&
_isDelete){
[textField
resignFirstResponder];
_textField2.enabled
=
YES;
[_textField2
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
}
else{
if (range.location
==
0 &&
_isDelete){
[textField
resignFirstResponder];
_textField3.enabled
=
YES;
[_textField3
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
return range.location
<=
4 ;
}
return
YES;
}
/**
*
观察textfield改变之后的属性时调用这个方法,在这个方法里面控制往前面的格子里跳转(因为光标在第一个的时候没有回调方法,所以要在每个之前加上@“
”)
*
* @param
notification
传入观察的对象
*/
- (void)textFieldTextDidChange:(NSNotification
*)notification
{
self.moneyLabel.hidden
=
YES;
self.checkLeftBtn.enabled
=
NO;
self.saveAndUseBtn.enabled
=
NO;
UITextField *textField = (UITextField
*)[notification
object];
if (!_isDelete) {
if (textField ==
_textField1 ) {
if (textField.text.length
>=
5) {
_textField2.enabled
=
YES;
[textField
resignFirstResponder];
[_textField2
becomeFirstResponder];
_textField2.text
=
@" ";
textField.enabled
=
NO;
}
}else
if(textField ==
_textField2
){
if (textField.text.length
>=
5) {
_textField3.enabled
=
YES;
[textField
resignFirstResponder];
[_textField3
becomeFirstResponder];
_textField3.text
=
@" ";
textField.enabled
=
NO;
}
}else
if
(textField ==
_textField3 ){
if (textField.text.length
>=
5) {
_textField4.enabled
=
YES;
[textField
resignFirstResponder];
[_textField4
becomeFirstResponder];
_textField4.text
=
@" ";
textField.enabled
=
NO;
}
}
}
if (_textField1.text.length
+
_textField2.text.length
+
_textField3.text.length
+
_textField4.text.length>=
20) {
self.checkLeftBtn.enabled
=
YES;
self.saveAndUseBtn.enabled
=
YES;
}
}
代码如下:
首先定义一个宏来实现过滤非法字符串,让输入的字符都是我定义的里面的字符。
#define kInputNumbers @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\n"
下面是定义的4个textfield
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField1;
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField2;
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField3;
@property
(retain,
nonatomic)
IBOutlet
JDTextField
*textField4;
因为并没有直接可以调用的方法,所以要自己加上观察
[[NSNotificationCenter
defaultCenter]
addObserver:self
selector:@selector(textFieldTextDidChange:)
name:UITextFieldTextDidChangeNotification
object:nil];
/**
*
为了统一界面,在第一个field之前加上@“
”
*
* @param
textField
*/
- (void) textFieldDidBeginEditing:(UITextField
*)textField{
if (textField ==
_textField1 && !_isDelete) {
textField.text
=
@" ";
}
}
/**
*
对应的field改变之前调用这个方法,在这里面来控制从前面格子往后跳转
*
* @param
textField textField
* @param
range
传入的是改变之前光标所在的位置和长度,如果是删除的话是改变后光标的位置,长度为-1
* @param
string
改变的字符
*
* @return
YES的时候确认改变,NO的时候抛弃改变(可以用来过滤字符)
*/
- (BOOL)textField:(UITextField
*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString
*)string{
//过滤非法字符
NSCharacterSet *cs = [[NSCharacterSet
characterSetWithCharactersInString:kInputNumbers]
invertedSet];
NSString *filtered = [[string
componentsSeparatedByCharactersInSet:cs]
componentsJoinedByString:@""];
BOOL basicTest = [string
isEqualToString:filtered];
if (!basicTest) {
return
NO;
}
//确定是否是删除键
_isDelete = string.length
<=
0 ?
YES :
NO;
if (textField ==
_textField1) {
//这个方法确保手动点击某个textfield时可以实现跳到下一个
if (range.location
==
5) {
[textField
resignFirstResponder];
_textField2.enabled
=
YES;
[_textField2
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
if (range.location
==
0 &&
_isDelete)
{
return
NO;
}
}
else
if (textField ==
_textField2) {
if (range.location
==
5) {
[textField
resignFirstResponder];
_textField3.enabled
=
YES;
[_textField3
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
if (range.location
==
0 &&
_isDelete){
[textField
resignFirstResponder];
_textField1.enabled
=
YES;
[_textField1
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
}
else
if (textField ==
_textField3) {
if (range.location
==
5) {
[textField
resignFirstResponder];
_textField4.enabled
=
YES;
[_textField4
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
if (range.location
==
0 &&
_isDelete){
[textField
resignFirstResponder];
_textField2.enabled
=
YES;
[_textField2
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
}
else{
if (range.location
==
0 &&
_isDelete){
[textField
resignFirstResponder];
_textField3.enabled
=
YES;
[_textField3
becomeFirstResponder];
textField.enabled
=
NO;
return
YES;
}
return range.location
<=
4 ;
}
return
YES;
}
/**
*
观察textfield改变之后的属性时调用这个方法,在这个方法里面控制往前面的格子里跳转(因为光标在第一个的时候没有回调方法,所以要在每个之前加上@“
”)
*
* @param
notification
传入观察的对象
*/
- (void)textFieldTextDidChange:(NSNotification
*)notification
{
self.moneyLabel.hidden
=
YES;
self.checkLeftBtn.enabled
=
NO;
self.saveAndUseBtn.enabled
=
NO;
UITextField *textField = (UITextField
*)[notification
object];
if (!_isDelete) {
if (textField ==
_textField1 ) {
if (textField.text.length
>=
5) {
_textField2.enabled
=
YES;
[textField
resignFirstResponder];
[_textField2
becomeFirstResponder];
_textField2.text
=
@" ";
textField.enabled
=
NO;
}
}else
if(textField ==
_textField2
){
if (textField.text.length
>=
5) {
_textField3.enabled
=
YES;
[textField
resignFirstResponder];
[_textField3
becomeFirstResponder];
_textField3.text
=
@" ";
textField.enabled
=
NO;
}
}else
if
(textField ==
_textField3 ){
if (textField.text.length
>=
5) {
_textField4.enabled
=
YES;
[textField
resignFirstResponder];
[_textField4
becomeFirstResponder];
_textField4.text
=
@" ";
textField.enabled
=
NO;
}
}
}
if (_textField1.text.length
+
_textField2.text.length
+
_textField3.text.length
+
_textField4.text.length>=
20) {
self.checkLeftBtn.enabled
=
YES;
self.saveAndUseBtn.enabled
=
YES;
}
}
相关文章推荐
- 常用正则表达式
- PostgreSQL使用技巧
- iOS开发UI篇—CAlayer(自定义layer)
- 自定义UITableViewCell勾选框的保持
- [转]异常:android.os.NetworkOnMainThreadException
- CSS布局之水平垂直居中
- 拥抱生命……
- 在Hyper-V中使用USB设备的方法(简略)
- 九度OJ 题目1065:输出梯形
- 人体所需的7大营养素
- HDU 4322 Candy (最大费用最大流)经典
- Android Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
- tree
- Win7旗舰版升级Win10提示错误代码C1900107的解决方法
- 自己平时长期积累的java资料可供大家学习
- MYSQL备份与恢复
- Mac下安装from matplotlib import pyplot或者 import matplotlib.pyplot as plt报错
- CAS:Compare And Swap 无锁
- hdu(5402)——Travelling Salesman Problem(模拟题)
- oracle实现查询每一个部门的员工工资排在前三的员工的基本信息详细举例