我一直在尝试学习委托协议的工作方式。我了解所有内容,但是除了使用表视图和可能的滚动视图时,我无法想到何时使用委派。
通常,什么时候使用委托?
首先,您应该知道委派模式不是iOS世界专用的:
在软件工程中,委托模式是面向对象编程中的一种设计模式,它允许对象组合实现与继承相同的代码重用。
但是在iOS世界中使用委托非常普遍,我假设您可以看到许多提供委托/数据源的类,这些类提供了为使用的实例提供属性或行为的能力。它是对象在CocoaTouch中如何相互交谈的主要机制之一。
但是,委派 不是 让对象在iOS中彼此交谈的唯一方法,您可能想知道:
备注 :如果您有兴趣比较它们,则可能需要查看以下文章:
因此,问题是:“那我为什么要使用委托而不是那些选项?”
我将尝试使其变得简单;当两个对象之间具有 一对一 关系时,我建议使用委托。这只是为了更清晰的 目标, 说话有点有关的 通知中心
是当使用代表团尝试是有意义的:
NotificationCenter 代表 一对多 关系;简单来说,它的工作方式是:在特定事件上 发布(通知) 通知,并
观察(获得通知) 此通知-可以 在 其他 任何
地方观察到;从逻辑上讲,这就是一对多关系的意思。它是观察者模式的表示。
为了简化起见,我将其作为步骤提及:
了解要求: 每个委托都有自己的 规则 ,在 委托协议中 列出,该 规则 是一组应符合此委托的方法签名。
符合委托: 通过标记,让您的班级成为委托。例如:class ViewController: UIViewController, UITableViewDelegate {}
。
连接委托对象: 标记你的类是委托是 不 足够的,你需要确保让您想要的对象由类确认,提供所需的工作,你的类。
实现需求: 最后,您的类 必须 实现委托协议中列出的所有必需方法。
听起来有点令人困惑吗?那么一个真实的例子呢?
请考虑以下情形:
假设您正在构建与播放音频有关的应用程序。一些viewControllers应该具有 音频播放器
的视图。在最简单的情况下,我们假设它应该有一个播放/暂停按钮和另一个按钮,让我们以某种方式显示播放列表,而不管其外观如何。
到目前为止,音频播放器视图具有单独的UIView
类和.xib
文件。应该将其作为子视图添加到任何所需的viewController中。
现在,如何为每个viewController的两个按钮添加功能?您可能会想:“简单来说,我将IBAction
在视图类中添加一个就可以了”,乍一看,听起来似乎还可以,但是经过一番思考之后,您将意识到,如果您是尝试处理在控制器层点击按钮的事件;为了清楚起见,如果在音频播放器视图中点击按钮时,每个viewController实现不同的功能怎么办?例如:在“A”viewController中点击播放列表将显示一个tableView,但在“ B” viewController中点击播放列表将显示一个选择器。
好吧,让我们对这个问题应用 委派 :
“#”注释代表“如何申请授权?”的步骤。 部分。
音频播放器视图:
// # 1: here is the protocol for creating the delegation
protocol AudioPlayerDelegate: class {
func playPauseDidTap()
func playlistDidTap()
}
class AudioPlayerView: UIView {
//MARK:- IBOutlets
@IBOutlet weak private var btnPlayPause: UIButton!
@IBOutlet weak private var btnPlaylist: UIButton!
// MARK:- Delegate
weak var delegate: AudioPlayerDelegate?
// IBActions
@IBAction private func playPauseTapped(_ sender: AnyObject) {
delegate?.playPauseDidTap()
}
@IBAction private func playlistTapped(_ sender: AnyObject) {
delegate?.playlistDidTap()
}
}
视图控制器:
class ViewController: UIViewController {
var audioPlayer: AudioPlayerView?
// MARK:- Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
audioPlayer = AudioPlayerView()
// # 3: the "AudioPlayerView" instance delegate will implemented by my class "ViewController"
audioPlayer?.delegate = self
}
}
// # 2: "ViewController" will implement "AudioPlayerDelegate":
extension ViewController: AudioPlayerDelegate {
// # 4: "ViewController" implements "AudioPlayerDelegate" requirments:
func playPauseDidTap() {
print("play/pause tapped!!")
}
func playlistDidTap() {
// note that is should do a different behavior in each viewController...
print("list tapped!!")
}
}
小建议:
作为一个 最
使用代表团最典型的例子是数据传递回]视图控制器之间。
本文向大家介绍swift 3.0中realm封装类示例代码,包括了swift 3.0中realm封装类示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 如果你用够了FMDB或者CoreData,不妨试试realm,本文主要给大家介绍了关于swift 3.0中realm封装类的相关内容,分享出来供大家参考学习,下面来一起看看吧。 最新更新,特别感谢@deepindo 总结 以上就是这篇文章的全
问题内容: Swift中是否有代表可以通过计算机的USB插入新设备时让我的班级知道?我想知道何时有新设备可供我的程序使用。 问题答案: 这个答案对我有用但是它需要一些修改,例如创建桥接头以导入某些特定的IOKit部件。 首先,将IOKit.framework添加到您的项目中(在“链接的框架和库”中单击“ +”)。 然后创建一个新的空“ .m”文件,无论其名称如何。然后,Xcode将询问是否应创建“
问题内容: 我已经看到swift中的闭包里面有$ 0,有时它们使用$ 1。$ 0到底是什么,您还可以使用其他$ x? 这是使用中的示例。 谢谢! 问题答案: 这是一个简写的参数名称。 从《雨燕书》中: “ Swift自动为内联闭包提供速记参数名称,可使用名称$ 0,$ 1,$ 2等来引用闭包参数的值。” — Apple Inc. “快速编程语言”。 它有助于减少代码的冗长性(有时以可读性为代价),
问题内容: 在Apple文档的参考部分中,有很多这类事情的实例: 的Objective-C“等效”是: 令我惊讶的是,(在Swift参考资料中)下划线和“动作”用斜体字后要留一个空格可能很重要。 但是我不知道这是要传达什么。所以也许问题是…参考文献中使用的约定是否有参考文献? -这是我在此引用中指向下划线使用的页面:https : //developer.apple.com/documentati
本文向大家介绍Swift使用Objective-C代码中的Swift类,包括了Swift使用Objective-C代码中的Swift类的使用技巧和注意事项,需要的朋友参考一下 示例 在同一模块中 在名为“ MyModule ”的模块内,Xcode生成一个名为的标头,该标头MyModule-Swift.h将公共Swift类公开给Objective-C。导入此标头以使用Swift类: 相关的构建设置:
本文向大家介绍在vue中使用G2图表的示例代码,包括了在vue中使用G2图表的示例代码的使用技巧和注意事项,需要的朋友参考一下 G2笔记 G2是蚂蚁金服的一套开源图表插件,因项目需要研究了一下,相比Echarts来说,G2文档比较难懂,网上也没有太多示例,所以在这里记录一些使用G2遇到的问题。 官方推荐在vue项目中使用Viser,它对G2进行了封装,使用起来可能更方便,又研究了一个Viser,结