self.textField.delegate = self在Swift中是如何工作的?

5

我正在iPhone应用程序开发中与键盘辞职功能一起工作。我想知道为什么。

self.textField.delegate = self 

需要包含在viewController的viewDidLoad中。我已经尝试找到原因,但目前还没有清晰的解释。


我知道委托。但是不明白它在这里有什么关系? - Josh
如果你想让控制器成为文本字段的代理,你还有其他方法吗? - Sulthan
这里的self并不一定指控制器,对吗? - Josh
1
如果代码在视图控制器源文件中,是的。 - FredericP
为了使用委托方法,例如shouldBeginEditing和所有需要指定的文本字段,delegate = self。 - Vinay Kanth
5个回答

6

几点说明:

  1. 你需要设置代理的原因是因为如果没有它,视图就不知道视图控制器的存在。所以它不会知道你的方法textFieldDidEndEditing,也就永远不会被调用。

  2. 这就是委托的基本原则,你告诉那个对象,“这里有一个对象,我希望你调用它的方法”。

  3. 它不必在viewDidLoad中设置,但通常将代理设置为视图的最方便的地方。

  4. 代理不一定是视图控制器(self),在你的情况下,这是最简单的方法,但对于UITableView,通常会有另一个类成为代理,以便所有逻辑不都在一个地方,也可以进行更改。


1
完美。正是我所寻找的。 - Josh

5
UITextFieldDelegate协议定义了用于管理UITextField对象中文本的编辑和验证的方法。该协议的所有方法都是可选的。
文本字段在重要更改时调用其代理的方法。您可以使用这些方法来验证用户输入的文本,响应特定的键盘交互,并控制整个编辑过程。编辑在文本字段成为第一响应者并显示键盘(或其分配的输入视图)之前不久开始。
更多信息,请查看苹果文档。 如果您不想管理UITextField对象中文本的编辑和验证,那么不需要使用self.textField.delegate = self,因为UITextFieldDelegate的所有方法都是可选的。
对于其他问题,例如.delegate = self是什么意思?
当您“设置代理”时,您所做的就是指定消息的接收方。
因此,

blah.delegate = amazingPlace 将消息发送到“amazingPlace”。

blah.delegate = somewhereElse 将消息发送到“somewhereElse”。

blah.delegate = self 将消息发送给您。

... 检查此源链接以获取详细信息


1
代理是iOS开发中的关键概念,因此我建议您仔细阅读有关代理的文档。在某些情况下创建自己的自定义代理也可以特别有用,因此了解并在合适的地方使用它们可以真正帮助改善项目的结构。
使用代理有几个关键原因。首先,它们允许类之间进行安全通信。在您的示例中,您正在使用的textField对象正在与您的视图控制器进行通信。这就是为什么您需要将您的视图控制器设置为其代理的原因。否则,文本字段没有代理对象(您的视图控制器)来进行通信。文本字段在特定时间触发某些方法,例如textFieldDidBeginEditing,如果有代理对象,则在其上调用这些方法。当您将您的视图控制器注册为文本视图的代理时,您可以利用这些回调。
另一个好处是委托允许您分离关注点并封装或抽象责任。也许文本视图的主要关注点是如何处理其视图中的文本,但不一定是在输入完成后要执行什么操作,或者当键盘上的返回按钮被按下时要执行什么操作,或者如何验证已输入的文本。最好将这些任务交给其他东西,例如代理(在 Obj-C 中),这就是为什么在您的示例中必须将一个类注册为另一个类的代理的原因。

0
如前所述,UITextfield代理允许您控制文本框上的事件。您将能够编辑诸如:
textFieldShoulEndEditing

或者

textFieldDidEndEditing

为了添加自定义规则,例如:文本验证。
请查看Apple文档
如果您不需要它,可以删除此行并在类声明中取消UITextfieldDelegate。

仍然没有回答问题。我知道我们可以使用textFieldDelegate实现哪些功能。我的问题完全不同:self.textField.delegate = self有什么作用? - Josh
它正在激活委托。 - Jan ATAC
为什么它会激活自身?为什么它必须在viewDidLoad中? - Josh
这个类实例(self)将能够覆盖UITextfield函数。ViewDidLoad用于在视图加载后立即调用所需的函数。花时间了解视图生命周期。 - Jan ATAC

-2

你需要在代码中使用 self.textField.delegate = self 来设置一个UITextField的代理, 或者将你的视图控制器(或任何其他类)设置为代理,使用 class MyViewController: UITextFieldDelegate 并且 在故事板中通过从textfield到viewcontroller进行控制拖动来设置UITextField的代理。

UITextField Delegate


2
我的问题是为什么需要它,而不是如何添加。 - Josh
是的,我现在明白了。 - Rool Paap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接