iOS 编程:更详细地了解第一响应者

Posted

技术标签:

【中文标题】iOS 编程:更详细地了解第一响应者【英文标题】:iOS programming: understand in more detail about first responder 【发布时间】:2020-04-27 13:20:30 【问题描述】:

我有一个带有文本字段和按钮的 ios 项目。单击文本字段使其成为第一响应者并调用键盘。然后当我点击按钮时,键盘仍然在屏幕上,文本字段仍然是第一个响应者。很自然的想法,点击按钮应该让它成为第一响应者并强制提交的文本退出,但是为什么这个过程在 Xcode 中没有发生呢? 如果我的应用程序有 2 个按钮 A 和 B,单击 A 会使其成为第一响应者吗?然后点击 B 之后会让 B 成为第一响应者并且 A 会辞职吗?

【问题讨论】:

【参考方案1】:

第一响应者是当前准备响应操作的任何控件。

在 UIKit 中,这通常是激活键盘并接收输入的控件。如果您希望该文本控件停止等待输入(进而关闭键盘),则应调用其 resignFirstResponder() 方法,该方法将第一响应者指挥棒传递给下一个等待组件。

在你的情况下,如果你想关闭键盘,你可以做两件事:

    可以调用文本域的resignFirstResponder() 在按钮的 IBAction 中,您可以写 self.view.endEditing(true),这将为您关闭键盘。

如果您有任何问题,请发表评论。

乐于助人!

【讨论】:

【参考方案2】:

如果您来自其他环境(例如桌面浏览器上的网页),您可以从一个元素“切换”到另一个元素,为每个元素赋予“焦点”。

在 iOS 中,UI 元素没有这种“焦点”状态。

例如,如果您点击UITextFieldUITextView,该对象将变为firstResponder,并且因为它接受键盘输入,所以会显示键盘。 UIButton默认启用canBecomeFirstResponder,并且不接受键盘输入。

这就是为什么点击按钮不会关闭键盘 - 或“将焦点从文本字段中移开”。

可以子类化UIButton 以赋予它这些属性,或者,如另一个答案所示,添加代码以将文本字段告知resignFirstResponder,但这不是默认行为。

【讨论】:

以上是关于iOS 编程:更详细地了解第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中第一响应者的正式定义是啥?

功能响应式编程语言规范

JVM上的响应式流 — Reactor简介

IOS函数响应式编程开发简析

iOS让键盘消失,取消第一响应,取消一级响应

RxSwift 响应式编程详解(001)