【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的使用、介绍、讲解、全解、简介、说明的更多相关文章

  1. Mybatis系列全解(三):Mybatis简单CRUD使用介绍

    封面:洛小汐 作者:潘潘 在理解中执行,在执行中理解,学习技术也循此道. 前言 上一篇文章 <Mybatis系列全解(二):Mybatis简介与环境搭建> ,我们对 Mybatis 做了初 ...

  2. Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行. 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从 ...

  3. Java IO编程全解(四)——NIO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7793964.html 前面讲到:Java IO编程全解(三)——伪异步IO编程 NIO,即New I/O,这 ...

  4. MDK 的编译过程及文件类型全解

    MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是很有帮助的,在有arm9开发的基础上,下 ...

  5. 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列

    第48章     MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  6. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...

  7. Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

    封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...

  8. Mybatis系列全解(六):Mybatis最硬核的API你知道几个?

    封面:洛小汐 作者:潘潘 2020 年的大疫情,把世界撕成几片. 时至今日,依旧人心惶惶. 很庆幸,身处这安稳国, 兼得一份安稳工. · 东家常讲的一个词:深秋心态 . 大势时,不跟风.起哄, 萧条时 ...

  9. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  10. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

随机推荐

  1. 【PAT甲级】1089 Insert or Merge (25 分)(插入排序和归并排序)

    题意: 输入一个正整数N(<=100),接着输入两行N个整数,第一行表示初始序列,第二行表示经过一定程度的排序后的序列.输出这个序列是由插入排序或者归并排序得到的,并且下一行输出经过再一次排序操 ...

  2. Java入门笔记 06-常用类

    介绍:本章将介绍Java的一些常用类,内容不完整,会在后续使用过程中逐步完善. 一. 字符串相关类: 1. String类介绍: |--- String类声明为final的,不能被继承: |--- 实 ...

  3. Linux学习:进入与退出系统

    进入Linux系统:必须要输入用户的账号,在系统安装过程中可以创建以下两种帐号: 1.root--超级用户帐号(系统管理员),使用这个帐号可以在系统中做任何事情. 2.普通用户--这个帐号供普通用户使 ...

  4. 《创业者技能树》--创业课--14天复盘第一课candy2--HHR计划

    1,厉害的人是如何分析问题的?

  5. Perl 笔记

    目录 Perl 学习 常用记录 基础 1. 运行perl 2. 字符串 3. 变量 4. 条件 5. 循环 6. 运算符 7. 时间日期 8. 子程序(函数) 9. 引用 10. 格式化输出 11. ...

  6. 【代码审计】XDCMS 报错注入

    审计的都是之前很老的一些的CMS,把学习的过程分享出来,如果有正在和我一起学习的兄弟们,希望看到文章之后会有所收获 ------------------------------------------ ...

  7. hadoop集群启动报错: java.io.IOException: Incompatible clusterIDs

    java.io.IOException: Incompatible clusterIDs in /export/hadoop-2.7.5/hadoopDatas/datanodeDatas2: nam ...

  8. 微信小程序开发调试阶段不校验请求域名

    在微信小程序开发官网上有说明: 在开发者工具的右上角有详情选项,可以勾选不校验合法域名,之后就可以与本地ip进行通信了!

  9. 关于浮动&关于BFC规范&whyoverflow清除浮动

    https://www.cnblogs.com/smivico/p/7656270.html 浮动 https://www.jianshu.com/p/4b93eecb090e BFC https:/ ...

  10. 【PAT甲级】1068 Find More Coins (30 分)(背包/DP)

    题意: 输入两个正整数N和M(N<=10000,M<=10000),接着输入N个正整数.输出最小的序列满足序列和为M. AAAAAccepted code: #define HAVE_ST ...