为啥需要在一个视图控制器中使用委托? [关闭]

Posted

技术标签:

【中文标题】为啥需要在一个视图控制器中使用委托? [关闭]【英文标题】:Why do you need to use delegates in one view controller? [closed]为什么需要在一个视图控制器中使用委托? [关闭] 【发布时间】:2016-06-23 05:33:51 【问题描述】:

我和我的兄弟开始使用 Swift 制作我们的 ios 应用程序,开始学习 Apple 制作的开始开发 iOS 应用程序 (Swift) 教程。在教程的开头,它让我们使用委托来允许按钮将标签的文本更改为文本字段中的文本。我们不确定为什么需要使用委托并让类自己进行数据访问。我们做了很多研究,似乎使用委托的唯一原因是当您需要将数据返回给以前的视图控制器时。为什么需要在单个视图控制器中使用委托?谢谢。

【问题讨论】:

【参考方案1】:

委托是一个对象,当该对象遇到程序中的事件时,该对象代表另一个对象或与该对象协作。委托对象通常是响应者对象——即从 AppKit 中的 NSResponder 或 UIKit 中的 UIResponder 继承的对象——它响应用户事件。委托是一个对象,它被委托控制该事件的用户界面,或者至少被要求以特定于应用程序的方式解释该事件。

委托方法具有常规形式。它们以执行委托的 AppKit 或 UIKit 对象的名称开头——应用程序、窗口、控件等;这个名字是小写的,没有“NS”或“UI”前缀。通常(但不总是)这个对象名称后跟一个表示报告事件的时间状态的辅助动词。换句话说,这个动词表示事件是即将发生(“应该”或“将”)还是刚刚发生(“已”或“已”)。这种时间上的区别有助于对期望返回值的消息和不期望返回值的消息进行分类。


您必须将框架可用委托与您可以创建的框架类协议/委托区分开来:

成为框架类的代表 实现委托的框架类或任何其他类声明委托属性和协议(通常是正式协议)。该协议列出了委托实现的必需和可选方法。要使您的类的实例充当框架对象的委托,它必须执行以下操作:

将您的对象设置为委托(通过将其分配给委托 财产)。您可以以编程方式或通过接口执行此操作 生成器。 如果协议是正式的,声明你的类采用 类定义中的协议。

例子:

class myClass: NSObject,myCustomDelegate 
   ...

在这个SO thread你也可以找到一些例子..

实现协议的所有必需方法和任何可选方法 您想参与的方法。

苹果官方Source

【讨论】:

我明白什么是委托,但我只是不明白为什么你需要一个合一的视图控制器。当视图控制器将信息返回给前一个时,这是有道理的,因为视图控制器不知道前一个。但是,在单个视图控制器中,所有对象都具有彼此相关的信息。为什么对象类不能自己做呢?为什么他们需要一个代表来做所有事情?谢谢。 正如我在回答的第一部分中所解释的,您可以将“框架委托”视为一种接口方法,以了解有关您的对象的更多信息: UITextField 有一个委托方法,允许他知道用户何时已经点击了键盘的返回按钮( textFieldShouldReturn )所以你有 myTextField.delegate = self (我的实际班级,我有我的东西)。为什么设置委托=自我?因为我想知道 myTextField 周围发生的事件;) 那么使用委托可以为一个类提供更多关于另一个类的信息,而如果不使用委托就无法获得这些信息? 使用这种委托给你的自定义类更多关于他的对象(文本字段,表格..)的信息,拦截他们的事件,调用他们的值实时更新,取决于你采用的框架类知道他的代表(UITableViewDelegate,UITextFieldDelegate...) 太棒了,非常感谢。【参考方案2】:

所以你可能会使用故事板,而你所有的 UIView 组件,如 UIButtons/UITextFields 等......都是出口,你可以直接在你的 UIViewController 中访问它们。

代表团:

委托是一对一的连接关系,想象这样一种情况,您需要为您的视图构建一个复杂的布局,您创建一个 UIView 的子类并在那里绘制/布局您的组件,然后将此视图添加到您的 UIViewController 中的 subivew,如果您需要侦听该视图中的事件(按钮点击、滚动视图偏移更改等),您将需要创建一个侦听这些事件的协议,并告诉您的 UIViewController 实现该协议的女巫生活在您的复杂 UIView 中,由于 MVC,您的控制器是需要更改视图、发出请求和其他内容的人,他必须完成艰苦的工作,因此您需要通过该委托将数据或事件传递给您的控制器。

我不是老师,所以希望你能理解我的意思。

【讨论】:

以上是关于为啥需要在一个视图控制器中使用委托? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在模态视图被解除后,父视图控制器中是不是有一个委托被调用?

为啥关闭视图控制器不会从内存中清除呈现的控制器?

为啥一个简单的模态视图控制器在呈现和关闭时会滞后?

情节提要弹出框已关闭,未调用委托方法

使用委托关闭视图不起作用

为啥此应用程序委托代码有效