【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. div 悬浮

    一个小需求,鼠标移动一个产品那, 显示这个产品的具体信息 代码如下: <a href="javascript:void(0);" onclick="frameSea ...

  2. C语言:计算输出给定数组中每相邻两个元素的平均值的平方根之和。

    //计算输出给定数组中每相邻两个元素的平均值的平方根之和. #include <stdio.h> #include <math.h> ]) { double a,b,s=0.0 ...

  3. 「SDOI2009」虔诚的墓主人

    传送门 Luogu 解题思路 离散化没什么好说 有一种暴力的想法就是枚举每一个坟墓,用一些数据结构维护一下这个店向左,向右,向上,向下的常青树的个数,然后用组合数统计方案. 但是网格图边长就有 \(1 ...

  4. css 属性值 calc (目前只了解部分)

    移动端页面,有如下图的需求: 实现效果: 实现 css 代码: .list {/*父级*/ border: 1px solid #E9EAEA; border-radius: 2px; backgro ...

  5. 棍子Sticks(poj_1011)[经典搜索]

    [题意描述] George用相同的长度棍子,将他们随机切成最多64个单位的长度,现在,他想回到原来的状态,但他忘了他原来的多少根,以及他们原本是多长.请帮助他和设计一个程序,计算最小的可能的原始长度. ...

  6. powershell 无法运行一些脚本的情况

    有时候在powershell里运行脚本会报错: 无法加载文件 ******.ps1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 "get-help about_signing" ...

  7. IDEA 创建 Spring Boot 多模块项目(Multi Modules)

    本准备写点代码实例放到网站,太多的模板,反而每次新建工程的时候很麻烦.于是准备把这个章节的内容提前先讲讲.正好把这个代码也管理起来.话说这个多模块功能还挺爽. 写过 C# 项目用过 Visual St ...

  8. mybatis用mybatis-generator-core-1.3.5.jar自动生成实体类

    原文出处:https://blog.csdn.net/shuoshuo_12345/article/details/80626241,本文只是个人总结而已! 方法1:在pom文件中添加依赖 只需在搭建 ...

  9. Linux kali安装或更新之后出现乱码

    打开终端,输入以下命令,之后重启. apt-get install ttf-wqy-zenhei

  10. nginx反向代理实战之轮询、Ip_hash、权重

    实验环境 192.168.200.111 web1 centos7 192.168.200.112 web2 centos7 192.168.200.113 wev3 centos7 三台主机环境: ...