文档章节

UITextField一些技巧总结

召唤攻城狮
 召唤攻城狮
发布于 2014/03/24 14:08
字数 1713
阅读 1196
收藏 3

我们在项目中肯定要用到UITextField允许用户输入,比如在登录、注册界面。小小的TextField有必要专门出一篇教程吗?当然是有必要的,因为使用场景不同,所以就有了不同的需求,本篇博客结合自己使用的一些需求,写出来与大家分享,如果有什么不对或者不足,请指正;如果大家有更好的方案,希望能够与我分享。另:本篇博客采用xib的编码方式,在关键地方会贴有图片,因为xib可以提高写博客速度,而且这也是ios开发的一个趋势。


1、需求1:改变TextField背景图片,

默认的TextField的Border Style这样的

此时你想设置背景图片,是没有效果的。选择其他三种Border Style,就可以设置背景图片了,很脑残的例子吧。


2、多个TextField时候,点击软键盘的换行(return)按钮,FirstResponder的切换

其实,就是将FirstResponder切换到下一个UITextField,到最后一个TextField时候,点击换行(return)按钮,键盘退出。

步骤:

首先在ErrorViewController.xib上面拖4个UITextField(声明下,这里的ErrorViewController中的Error没有什么“错误的意思”,就是随便命名的,各位不要被误导),从上到下一次摆放,然后右键连线TextField至File’s Owner,这是为了设置delegate,之前的博客我已经说明了设置代理delegate的重要性,这一步往往容易被忽略和遗忘。接着,关联xib中的四个UITextField到ErrorViewController.h,分别命名为errorTF1、errorTF2、errorTF3、errorTF4。

ErrorViewController.h代码如下

@interface ErrorViewController : UIViewController

@property (strong, nonatomic) IBOutlet UITextField *errorTF1;

@property (strong, nonatomic) IBOutlet UITextField *errorTF2;

@property (strong, nonatomic) IBOutlet UITextField *errorTF3;

@property (strong, nonatomic) IBOutlet UITextField *errorTF4;

@end

在ErrorViewController.m中,ErrorViewController实现UITextFieldDelegate协议,然后实现协议中一个optional的方法- (BOOL)textFieldShouldReturn:(UITextField *)textField,ErrorViewController的部分代码如下,

@interface ErrorViewController ()<UITextFieldDelegate>


@end


- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

    return NO;//这里return NO或者YES貌似没有什么区别,我很疑惑,希望高手给我解惑。

}

这样就完成了基本要做的事情,然后是最后一步,就是完善并填充- (BOOL)textFieldShouldReturn:(UITextField *)textField方法,其完整代码如下,

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

    if (textField == errorTF1) {

        [errorTF2 becomeFirstResponder];

    } else if (textField == errorTF2) {

        [errorTF3 becomeFirstResponder];

    } else if (textField == errorTF3) {

        [errorTF4 becomeFirstResponder];

    } else if (textField == errorTF4){

        [errorTF4 resignFirstResponder];

    }

    return NO;//YES or NO,that is a question

}

这段代码相信大家都看得懂,不多做解释了,这样就实现了点击换行(return)按钮,firstResponder跳转到下一个TextField,到最后一个TextField时候,键盘退出。



3、需求2:多个TextField,键盘遮挡,界面上移,

本来准备写一下错误的代码,给各位一点提醒不要误入歧途,但是忘了之前错误代码怎么写的,而且再重写的话也比较浪费时间,所以直接写出我整理好的正确的方法吧。我们知道,在iPhone竖屏的情况下,软键盘的高度是216,所以如果为了不让键盘挡住TextField,那么应该把界面向上移动,让TextField的底部刚好在键盘的顶部,这种情况下使用NSNotification通知,是能够比较好的解决这个问题。

这次拖动10个UITextField到TFViewController.xib里面,重复上面“需求2”的步骤,设置delegate,在TFViewController.h中声明10个UITextField property,分别命名为tf1、tf2、tf3、……、tf10,TFViewController实现UITextFieldDelegate协议,并实现其中方法-(BOOL)textFieldShouldReturn:(UITextField *)textField可选(optional)方法,如下所示,

#pragma mark - UITextFieldDelegate

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

    if (textField == tf1) {

        [tf2 becomeFirstResponder];

    } else if (textField == tf2)

    {

        [tf3 becomeFirstResponder];

    } else if (textField == tf3)

    {

        [tf4 becomeFirstResponder];

    } else if (textField == tf4)

    {

        [tf5 becomeFirstResponder];

    } else if (textField == tf5)

    {

        [tf6 becomeFirstResponder];

    } else if (textField == tf6)

    {

        [tf7 becomeFirstResponder];

    } else if (textField == tf7)

    {

        [tf8 becomeFirstResponder];

    } else if (textField == tf8)

    {

        [tf9 becomeFirstResponder];

    } else if (textField == tf9) {

        [tf10 becomeFirstResponder];

    }  else if (textField == tf10) {

        [tf10 resignFirstResponder];

    }

    return YES;

}

这几个步骤和“需求2”没有区别,之所以重复一遍,是因为这几个步骤是“需求3”实现的基础,所以写一遍也不嫌多。

接下来就是实现界面上移,不遮挡TextField的关键地方了。很幸运的是,苹果在系统给我们封装了“键盘弹出”和“键盘消失”的事件,此处我们只需要用到“键盘消失”的系统通知,我们可以使用通知来监听键盘的行为,判断当前为firstResponder的TextField是否被键盘遮挡,如果被遮挡,那么屏幕上移,否则不做处理,这是很简单的逻辑,实现的代码如下,




(2)在TFViewController的- (void)viewWillAppear里面添加监听“键盘消失”的通知,

- (void)viewWillAppear:(BOOL)animated

{

    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWillHide:)

name:UIKeyboardWillHideNotification object:nil];

    

}

相应的,我们需要在- (void)viewWillDisappear时候,将NSNotification移除,这就像内存管理一样,你在不用的时候需要移除你添加的通知,

键盘弹出和消失的系统事件就是UIKeyboardWillShowNotificationUIKeyboardWillHideNotification针对“键盘消失”的情况keyboardWillHide来处理,当然这些代码是写在TFViewController.m文件中的,下面就是实现这该方法的代码,

- (void)keyboardWillHide:(NSNotification *)notification

{

    [UIView animateWithDuration:0.3 animations:^{

        self.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

    }];

    

}

这是将self.view移回到原来位置的方法,那么对应的将界面上移的代码是写在什么地方的呢?就是写在某个TextField变为firstResponder、处于被编辑的时候,我们进行判断并看是否要上移self,view,代码如下,

- (void)textFieldDidBeginEditing:(UITextField *)textField

{

    [UIView animateWithDuration:0.3 animations:^(void) {

        CGFloat keyboardHeight = 216;//键盘高度

        //textField底部的坐标

        CGFloat bottomY = textField.frame.origin.y+textField.frame.size.height;

        //VIEW底部到textField底部的距离

        CGFloat tempHeight = self.view.frame.size.height-bottomY;

        //键盘高度超过BUtton底部的距离,即需要viewframe上提得高度

        CGFloat upOffset = keyboardHeight-tempHeight;

        if (upOffset>0) {

            [UIView animateWithDuration:0.3 animations:^{

                self.view.frame = CGRectMake(0, -upOffset, self.view.frame.size.width, self.view.frame.size.height);

            }];

        }

    }];

}

这样键盘就不会挡住TextField,不会让用户不能输入的。

—————————————————————————————————————————————

各位有没有觉得这样实现,代码写的不“对称”,因为UIKeyboardWillHideNotificationUIKeyboardWillShowNotification一起出现才感觉好,还有就是代理方法- (void)textFieldDidBeginEditing- (void)textFieldDidEndEditing一起出现才完美,实际情况是我也想这样才好,但是没用到就没用到了呗,有强迫症的观众不要抓狂啊。其实我也试过了,如果只使用UIKeyboardWillHideNotificationUIKeyboardWillShowNotification不能实现想要的结果,如果只使用textFieldDidEndEditingtextFieldDidBeginEditing同样一不行,我这样交叉着各使用了一个,恰好实现了。如果有人能写出“对称”的代码,来实现这个功能,请让我也知道。



本人建了一个ios交流群188647173,希望大家能在群里相互学习,共同进步。求大神照耀啊。。。

我的邮箱是zheniyerenrou@163.com,有什么质疑或者疑问,可以发我邮件。


© 著作权归作者所有

召唤攻城狮
粉丝 182
博文 53
码字总数 49671
作品 0
玉林
私信 提问
iOS-开发小技巧

在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新。 UITableView的Group样式下顶部空白处理 获取某个view所在的控制器 两种方法删除NSUserDefaults所有记录 打印系统所有已...

袭锐
2017/07/16
0
0
UITextField详解之一:UITextField基本属性

UITextField是IOS开发中用户交互中重要的一个控件,常被用来做账号密码框,输入信息框等。创建一个用于输入的UITextField其实很简单,在平时使用中,更多的是需要 UITextField和其他UI控件之...

hi-小疯疯
2016/01/23
172
0
iOS小技巧总结,绝对有你想要的

字数947 阅读2032 评论26 喜欢99 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新。 UITableView的Group样式下顶部空白处理 UITableView的plain样式下,取消区头停滞效果 ...

andyhe91
2016/09/07
83
0
iOS 常用组件-高效切圆角方法总结

点击上方“程序员大咖”,选择“置顶公众号” 关键时刻,第一时间送达! 前言 iOS 客户端开发中,经常碰到圆角视图的需求,本文简单总结一下 UIView 及其子类的一些切圆角方法,并且保证避免...

px01ih8
2017/12/10
0
0
获取UITableViewCell中UITextField的值方法总结

UITableViewCell的contentView中的UITextField的值获取有几种方法,本人简单总结一下。 1. 获取UITextField所以Cell的NSIndexPath,知道了NSIndexPath就知道了这个UITextField是干什么的了。 ...

长平狐
2012/08/13
4.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
8
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
9
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
7
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
8
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部