UITextField的使用、介绍、讲解、全解、简介、说明
【2018年中秋节良心写作】文章将尽可能的全面介绍UITextField的所有相关知识,逻辑连贯,需要认真理解,一气呵成。
关键词:
屏幕键盘(onscreen keyboard)、键盘自定义、键盘类型、规范输入源、目标动作机制(terget-action)、委托(delegate)、控件、覆盖视图、内建、targets和actions
UITextField类
这是一个在界面中显示可编辑文本区域的对象。
一、概括
使用UITextField这个对象,可以收集用户在使用屏幕键盘【】过程中基于文本的输入信息。意思就是,如果你想让用户使用屏幕键盘输入信息,那么就可以使用UITextField这个对象来获悉用户在键盘上输入了些什么内容。屏幕键盘的样式可以配置成不同的输入类型【】来规范输入,以适应不同的输入场景。比如,输入纯文本、输入电子邮件地址、输入数字等等场景。因此,配置好键盘的类型,可以作为规范输入源【】的一种手段。在输入手机号码的文本输入框,则使用数字键盘可以更加省事,避免用户输入不合理的文本。UITextField对象被配置成与系统的屏幕键盘绑定的,即当用户点击UITextField对象时,UITextField就被激活,屏幕键盘就会自动被调用起来(从屏幕底部弹出在用户面前,方便用户接下来的输入操作)。当然,刚刚说了是默认配置,也就是说,UITextField也可以使用其他非系统的屏幕键盘,这里涉及到的是键盘自定义【】方面的知识。UITextField对象使用目标动作机制【】和委托模式【】让开发者知道UITextField的所有事件。
UITextField对象除了基本的文本编辑功能之外,开发者也可以往UITextField对象上面添加视图,以用来展示其他的一些附加信息,或者添加一些可点击控件【】提供给用户做一些附加的操作。开发者可以将自定义的覆盖视图【】添加在UITextField对象中的各个元素上,比如书签按钮、搜索图标等元素上。UITextField自身依靠这个设计,苹果开发工程师放置了一个内建【】的覆盖视图在UITextField上,用它来提供“清空当前文本内容”的功能。当然,虽然是苹果开发工程师为UITextField设计的,开发者也是可以选择使用或者不使用这个内建的清除功能按钮(如下图)的。
当创建好一个UITextField对象并将它添加到界面上之后,开发者需要对这个UITextField对象进行一番配置。配置任务涉及到下面的全部或者部分:
1、为UITextField对象配置一个或多个targets和actions【】。
2、之前说到的UITextField默认使用系统键盘,也可以使用非系统键盘,但是不管使用哪种,请为该UITextField对象配置好这个键盘的相关属性。
3、除了对UITextField的做一些基本的配置之外,由于该控件涉及到一些复杂的用户交互,因此这些交互的处理等事情应该交给delegate来做。因此,请为UITextField分配好委托对象来处理重要任务。比如:(这一块内容,需要用过UITextFieldDelegate做详细的了解)
- 确定是否允许用户编辑UITextField中的内容
- 验证用户输入的内容
- 响应键盘中Return按钮
- 将用户输入的内容显示在其他控件上
4、将创建的这个UITextField对象被一个控制器对象引用。
二、关于显示和隐藏键盘
当一个UITextField对象成为第一响应者【】的时候,iOS系统会自动的展示出键盘并且将用户在键盘上的输入和这个UITextField对象绑定在一起。这就是为什么,当用户点击一个UITextField对象,键盘弹出后,用户在键盘上的输入可以直接显示在这个UITextFiled上面,而这一整个过程,开发者不需要做额外的关心,只需要将UITextField对象创建出来,做好上面提到的基本配置,然后添加在界面上就能完成。那么UITextField如何才能成为第一响应者呢?当用户点击界面上的UITextField对象的时候,这个UITextField对象就会自动的成为第一响应者。开发这也可以使用代码让一个UITextField对象强制成为第一响应者,调用这个UITextField的实例方法-becomeFirstResponder即可。一般是在需要用户输入一些信息的时候,开发者让UITextField对象强制成为第一响应者。
提示:
键盘的出现有可能掩盖界面的某些部分。开发者需要更新界面,以确保正在编辑的UITextField是可见的。监听键盘的通知【】来检测到键盘的出现和消失,并对界面进行一些必要的更改。
相反的,开发者也可以使用代码让UITextField对象强制放弃第一响应者,这样系统就可以让键盘隐藏。什么情况下,开发者会这样做呢?比如当用户点击键盘的Return按钮的时候,开发者需要监听用户的这种操作,当用户点击键盘的Return后,开发者有可能需要让UITextField对象放弃第一响应者。iOS系统也会做自动收起键盘的操作,比如,当用户点击不支持键盘输入的其他控件的时候,iOS系统会自动的让当前的UITextField控件放弃第一响应者,隐藏(收起)键盘。
稍微总结下:
上面的内容要注意下顺序逻辑,当UITextField成为第一响应者的时候,iOS系统会自动的弹出键盘;当UITextField放弃第一响应者的时候,iOS系统会自动的收起键盘。也就是说,成为第一响应者和弹出键盘,放弃第一响应者和收起键盘,是同时存在的,不会出现UITextField成为第一响应者,但是键盘不弹出等类似的情况。
然后,如何让UITextField成为第一响应者或者放弃第一响应者呢?可以通过用户触发某些事件后,iOS自动的响应,也可以由开发者用代码强制实现。
UITextField既然有编辑功能,iOS用编辑状态【】来表示UITextField的编辑过程中的各种状态。键盘的出现和消失是会影响到UITextField的编辑状态的,并且是自动的。比如当UITextField对象成为第一响应者的时候,键盘自动弹出,UITextField进入编辑状态,并且会像UITextField的委托代理发送对应的通知【】。
三、配置键盘的外表
开发者可以使用UITextField的UITextInputTraits协议中定义的一些属性来自定义键盘。UIKit框架提供了支持用户当前语言的标准化键盘,还支持用于输入数字、URL、电子邮件地址和其他特定类型信息的专用键盘。开发者可以使用该协议的属性来调整键盘的特性,这里所说的特性比如是:
- 键盘展示的样式
- 键盘的自组织行为
- 键盘的自校正行为
- 键盘上Return键的显示
四、响应与键盘相关的通知
刚刚在上面的第二点也进行了说明,键盘的弹出和收起是由iOS系统管理控制的,键盘的展示和隐藏跟随的是第一响应者的变化。为了让开发这能把控键盘的相关事件,iOS系统会发布与键盘相关的通知,开发者应该认真收听这类通知,并且做好项目中的把控。这类通知包括:
- UIKeyboardWillShowNotification
- UIKeyboardDidShowNotification
- UIKeyboardWillHideNotification
- UIKeyboardDidHideNotification
- UIKeyboardWillChangeFrameNotification
- UIKeyboardDidChangeFrameNotification
在每个通知对象中都包含一个userInfo的字典对象,里面包含了键盘的大小(size)信息。因为键盘可以遮盖住界面,因此开发者应该好好的利用这个size信息重新布局屏幕上的内容。一般可以分两种情况,对于嵌入在滚动视图(ScrollView或其子类)中的内容,可以将用户正在使用的UITextField对象滚动到键盘之上以避免被遮住。对于其他情况,那就调整底部视图(view对象)的位置,以避免其被键盘覆盖。
五、格式化UITextField中的文本内容
UITextField提供了两种方式供开发者使用,来设置UITextField中的文本格式:
- 首先开发者可以使用UITextField的相关属性来控制文本格式,比如字体(font)、颜色(color)、样式(style)。或者也可以利用NSAttributedString类为UITextField对象设置富文本字符串。
- 然后开发者也可以使用NSFormatter对象设置UITextField对象中文本格式。
像font、textColor和textAlignment这些属性,影响的是UITextField对象中文本的外表样式。并且作用的对象是整个文本字符串。比如开发者指定textColor为红色,那么UITextField对象中整个字符串的字体颜色都是红色。如果,开发者需要对TextField中的文本进行更加细腻化、或者说是局部效果的化,就需要使用NSAttributedString对象。
上面提到的NSFormatter对象,其实UITextField对象并没有提供这方面的原生支持【】。但是,开发者可以使用UITextField的delegate来完成实时格式化字符串操作。比如使用-textField:shouldChangeCharactersInRange:replacementString:协议方法,在用户输入过程中验证和做格式化操作。比如,UITextField中的文本字体颜色默认是黑色,当检测到用户输入数字文本时,把数字的字符颜色格式化为红色,起到提示作用等等场景。
六、使用覆盖视图(Overlay View)来编辑UITextField中的文本内容
首先需要明白的是,UITextField这个控件的内置结构,覆盖视图是UITextField对象的可编辑区域【】外左侧和外右侧显示的小视图。如果开发者不配置覆盖视图,可编辑区域将会占用覆盖视图的区域,一并纳入可编辑区域范围。开发者如果要使用覆盖视图,方法很简单。将一个按钮设置为UITextField对象的覆盖视图就行,这个按钮一般是基于image的按钮,比如一个书签icon。为这个按钮配置好target和action以响应用户的点击事件。下面的代码就是为UItextField设置左边的覆盖视图:
UIButton* overlayButton = [UIButton buttonWithType:UIButtonTypeCustom];
[overlayButton setImage:[UIImage imageNamed:@"bookmark"] forState:UIControlStateNormal];
[overlayButton addTarget:self action:@selector(displayBookmarks:)
forControlEvents:UIControlEventTouchUpInside];
overlayButton = CGRectMake(, , , ); // Assign the overlay button to a stored text field
self.textField.leftView = overlayButton;
self.textField.leftViewMode = UITextFieldViewModeAlways;
UITextField对象自身也内建(build-in)了一个覆盖视图在右边覆盖视图的位置上,是一个清除按钮,这个清除按钮可以让用户很方便的删除UITextField中的所有文本内容。开发者也可以自定义右边的覆盖视图,使用好rightViewMode属性和claerButtonMode来确定好应该何时应该显示自定义的覆盖视图,何时显示清除按钮。比如,开发者监听如果用户还没有输入任何文本的时候,右边的覆盖视图显示自定义的复制功能的按钮,如果已经有文本内容,就让自定义的按钮消失,显示的是内建的清除功能的按钮等等情景。
七、验证文本和管理编辑过程
UITextField是在其delegate的帮助下管理其文本的编辑过程。当用户在与一个UITextField对象进行交互时,UITextField对象会通知它的delegate,并且可以让delegate控制正在发生的事情。有一点尤其要注意,UITextField允许它的delegate控制正在发生的事,正在发生的事。不是发生以后在通知delegate,而是能够直接扭转,在发生时扭转。说得神乎其神,其实就是在用户-敲击键盘-显示在UITextField前,通知了delegate而已。用户与UITextField之间的交互大致可以分为三个阶段,用户点击UITextfield对象,让UITextField对象启动编辑;用户在键盘上输入的过程;用户退出编辑。这个阶段过程,UITextField都可以通过delegate与开发者进行互动,开发者可以通过delegate来防止用户启动或停止编辑过程,或者在键入文本时验证文本。开发者还可以使用委托方法【】来执行相关任务,例如将用户键入的文本显示在界面的其他视图上等等场景。
八、UITextField接口文件解读
(1)验证和处理编辑
@property(nonatomic, weak) id<UITextFieldDelegate> delegate;
UITextField的使用、介绍、讲解、全解、简介、说明的更多相关文章
- Mybatis系列全解(三):Mybatis简单CRUD使用介绍
封面:洛小汐 作者:潘潘 在理解中执行,在执行中理解,学习技术也循此道. 前言 上一篇文章 <Mybatis系列全解(二):Mybatis简介与环境搭建> ,我们对 Mybatis 做了初 ...
- Mybatis系列全解(二):Mybatis简介与环境搭建
封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行. 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从 ...
- Java IO编程全解(四)——NIO编程
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7793964.html 前面讲到:Java IO编程全解(三)——伪异步IO编程 NIO,即New I/O,这 ...
- MDK 的编译过程及文件类型全解
MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是很有帮助的,在有arm9开发的基础上,下 ...
- 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列
第48章 MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!
封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...
- Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式
封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...
- Mybatis系列全解(六):Mybatis最硬核的API你知道几个?
封面:洛小汐 作者:潘潘 2020 年的大疫情,把世界撕成几片. 时至今日,依旧人心惶惶. 很庆幸,身处这安稳国, 兼得一份安稳工. · 东家常讲的一个词:深秋心态 . 大势时,不跟风.起哄, 萧条时 ...
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
- Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解
封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...
随机推荐
- python实现基于百度路径规划接口的坐标对获取两点驾车距离的计算
今天为大家介绍一种通过python实现坐标对间距离数据的获取方法.接口采用百度开发的路径规划接口. 1.调用接口: 接口:(传入起点坐标串,结束坐标串:ak值需要注册百度开发者) 接口详细说明 htt ...
- rf 环境
googlechrome webdriver驱动下载 addrhttps://sites.google.com/a/chromium.org/chromedriver/downloads谷歌浏览器ap ...
- Git 安装配置及工作流程
在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://git-scm.co ...
- Centos610 Oracle 监听文件配置参考
lister.ora配置参考 # listener.ora Network Configuration File: /home/oracle/app/oracle/product//dbhome_1/ ...
- centos 时区的更改 UTC TO CST
在CentOS Linux中终端命令中执行以下命令: 1).vi /etc/sysconfig/clock #编辑时间配置文件 ZONE="Asia/Shanghai" UTC ...
- 收藏---wordpress搭建出来的blog
http://blog.luofei.org/2012/02/painters-and-paintings-through-the-eyes-of-faith/
- linux 镜像备份工具rsnyc
1.本地拷贝文件nohup rsync -avzh /data/wwwroot/xhprof/* /mnt/xhprof/ &2.更改文件夹名称mv /data/wwwroot/xhprof ...
- 看完这篇微服务架构设计思想,90%的Java程序员都收藏了
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...
- 读书笔记 - The Hitchhiker's Guide to Python
网址 http://docs.python-guide.org/en/latest/ Reuqests库的作者写的经验 1. 项目需要一个好的结构 https://www.kennethreitz.o ...
- VS2019 发布单文件
在项目.csproj文件下添加 <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework&g ...