UITextField 概述

597 阅读7分钟

UITextField 概述

你可以使用 文本域(TextField)来获取用户从屏幕上键盘输入的基于文本的输入。键盘可以针对不同的输入类型进行配置,比如说纯文本、邮件、数字等等。文本域使用target-action机制和一个代理对象来报告编辑过程中的更改。

除了几本的文本编辑行为,你可以为文本域增加覆盖视图来展示额外信息,并提供附加的点击控制。你可以增加类似书签按钮或者搜索标识元素的定制覆盖视图。文本域提供了一个内置的覆盖视图来清楚当前文本。使用定制覆盖视图是可选的。

在向你的界面增加一个文本域之后,你可以配置它的使用。配置包含以下部分或者全部的任务:

  • 为文本域配置1个或者多个target 和actions 
  • 为文本域配置与键盘相关的属性
  • 为重要的任务配置代理,比如:
    • 决策用户是否被允许编辑文本域
    • 验证用户输入的文本
    • 响应键盘回车点击
    • 将用户输入的文本转发到你app的其他部分
  • 在控制器对象中存储文本域的引用,更多关于文本域的代理请看 UITextFieldDelegate

展示和隐藏键盘

当一个文本域成为第一响应者时,系统会自动展示键盘,并且绑定它的输入到文本域中。当用户点击一个文本域时,这个文本域会成为第一响应者。你也可以通过调用文本域的becomeFirstResponder强制一个文本域成为第一响应者。

注意键盘的外观可能会遮挡你用户界面的一部分。在必要时候你应该更新你的界面以确保正在被编辑的文本域是可见的。使用键盘通知来检测键盘的出现和消失,并且适时的更新你的界面。更多信息,请看下面的Responding to Keyboard-Related Notifications。*

你可以通过调用你文本域的resignFirstResponder方法让系统关闭键盘。通常是为了响应特殊的交互会关闭键盘。比如用户点击了回车键,你就需要关闭键盘。系统也可以关闭键盘以响应用户动作。特别的,当用户点击了一个不支持键盘输入的对象时,系统会关闭键盘。

键盘的展示和关闭,影响文本域的编辑状态。当键盘出现时,文本域进入编辑状态,并且发送合适的通知给它的代理。同样的,当文本域放弃第一响应者的状态时,文本域会离开编辑态并重新通知它的代理。更多在编辑时的事件序列信息请看Validating Text and managing the Editing Process

配置键盘的外观

你可以通过使用UITextInputTraits协议属性来定制你的文本域键盘。UIKit支持用户当前语言的标准键盘,还支持输入数字、URL、邮箱等等特殊信息类型的定制键盘。你可以用使用这个协议的属性来调整键盘的特征,比如:

  • 键盘展示的类型
  • 键盘自动大小写的行为
  • 键盘自动更正的行为
  • 回车展示类型

更多定制键盘属性见developer.apple.com/documentati…

响应与键盘有关的通知 Responding to Keyboard-Related Notifications

因为系统管理着键盘的展示和隐藏以回应响应者的变化,系统会发出如下notifications为了跟踪与键盘相关的变化:

  • 键盘将出现
  • 键盘已经出现
  • 将隐藏
  • 已隐藏
  • 将改变位置
  • 已改变位置

每一个通知包含了·userInfo·的字典,里面包含了键盘的大小。因为键盘可能会遮盖你的界面,你应该使用这个大小信息重新布局你在屏幕上的内容。对于镶嵌在滚动视图中的内容,你可以将文本域滚动到视图中(图2)。其他情况下,你可以重新调整你主要内容视图的布局以防止被键盘遮挡。

image.png

文本域中的文本格式Formatting the Text in a Text Field

你可以对文本域中的文本座以下两种操作:

  • 你可以使用文本的属性改变字体、颜色、文本的风格。或者使用·NSAttributedString·。
  • 你可以使用·NSFormatter·对象

字体、字体颜色、文本或者其他属性会影响文本域中的字符串外观,修改这些属性会影响整个字符串的外观。更加个性化的格式使用NSAttributedString对象。

UITextField类并不天然支持通过NSFormatter定制字符串,但是你可以使用文本域的代理来定制你自己的内容。为此,你需要使用文本域代理方法来检验文本并定制它的格式。比如,使用·textField:shouldChangeCharactersInRange:replacementString:·防范来验证和格式化文本当用户正在输入时。更多信息请看Data Formatting Guide

使用遮盖视图来编辑内容 Using Overlay Views to Edit Content

遮盖视图是展示在文本视图左右两侧的不可编辑的区域。通常遮盖视图是基于图片的按钮,你设置这些按钮作为额外的编辑控制。比如,你可能会使用遮盖视图实现一个书签按钮。为了配置一个按钮为遮盖视图,指定一张图片作为按钮的内容,配置这个按钮点击事件的target 和action。

列表1展示了如何增加一个按钮作为文本域的左侧遮盖视图,这段代码创建了一个按钮并配置了它的大小和内容。·leftViewMode·属性指定你的按钮何时被展示出来。当用户点击这个按钮,这个按钮调用已经配置好的action方法。

Listing 1 Adding an overlay view to a text field

let overlayButton = UIButton(type: .custom)

let bookmarkImage = UIImage(systemName: "bookmark")

overlayButton.setImage(bookmarkImage, for: .normal)
overlayButton.addTarget(self, action: #selector(displayBookmarks),     for: .touchUpInside)overlayButton.sizeToFit()        
// Assign the overlay button to the text field

textField.leftView = overlayButton
textField.leftViewMode = .always

当配置遮挡视图时,考虑你是否想要你的文本域展示内置的清空按钮。这个那妞展示在右侧遮挡位置,但是当你提供一个定制的右侧遮挡视图时,使用·rightViewMode·和·clearButtonMode·属性来决定你的定制化遮挡视图何时出现或者你的清空按钮何时出现。

检测文本和管理编辑过程Validating Text and Managing the Editing Process

文本域通过代理对象的帮助来管理文本的编辑。当用户与文本域进行交互时,文本域通知它的代理,给代理一个机会去控制正在发生的事情。你可以使用代理方法去阻止用户启动或停止编辑过程,或者在输入文本时候对其进行验证。你还可以使用代理方法去执行相关任务,比如基于用户已经输入的信息更新你界面的一部分。

更多关于使用文本域代理来管理编辑交互的信息,看UITextFieldDelegate。

国际化internationalization

默认的设备语言影响文本域的弹出键盘(包括回车键)。这个功能默认开启。你的文本域应该具备处理任何语言输入的能力

当使用storyboard来构建你的界面时,使用Xcode的基础国际化特性来配置你的项目。当你增加一个本地化位置时Xcode会为本地化增加一个字符串文件。当你通过代码配置你的界面时,使用系统内置支持加载本地化字符串和系统的能力。更多关于本地化界面的信息,关注Internationalization and Localization Guide。

可访问性Accessibility

本文域默认可访问。默认的访问途径是 User Interaction Enabled。 更多关于iOS控制访问性,关注UIControl。更多通用信息关注Accessibility Programming Guide for iOS

状态预留 State Preservation

当你给·restoration Identifier·属性时,如果存在文本选中区域,它会保留这个文本选中区域。在下一次加载中,文本域会尝试恢复这次选中。如果选中区域不能应用到当前文本,那么不会继续选中。更多关于状态保留和恢复工作,关注App Programming Guide for iOS。

更多内容参见官网:developer.apple.com/documentati…