具有多个控制器的单个委托
Single delegate with multiple controllers
我 运行 想用一个委托注册 2 个不同的 UIViewController,因为我的项目一次显示 2 个 UIViewController。当我触发事件时,我希望两个控制器都得到通知,但不幸的是只有一个控制器可以接收事件,而不是两个。
示例代码如下:
@objc protocol DownloaderDelegate: class {
func complete()
}
class Downloader {
static let sharedInstance = Downloader()
weak var delegate: DownloaderDelegate?
private init() {
}
func downloadFile() {
self.delegate!.complete()
}
}
然后我在两个 UIViewControllers 中都这样使用它:
override viewDidLoad() {
super.viewDidLoad()
Downloader.sharedInstance.delegate = self
}
知道如何让两个视图控制器都监听来自单个委托的事件吗?
它是一个单一的属性,所以那里只能存在一个东西。您有多种选择可以让多个 VC 对某事做出反应。您可以拥有一组委托、订阅和发送通知、拥有一个容器 VC 来管理另外两个 VC 或许多其他方法。
事实上,我认为这里最好的解决方案是从委托模式转移到通知模式(有关 Apple 文档的更多详细信息:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html)。
另一种解决方案是用一组 DownloaderDelegate 替换您的委托。但我真的认为通知解决方案是最干净、最简单的。
Swift NSNotification
上有一篇很好的文章:https://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/
编辑:
你应该注意观察者的移除。最简单的方法是在每个 class 侦听事件中添加:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
不,这不可能。可以这样想。下载器 class 有一个名为 'delegate' 的 属性。 属性 一次只能保存对单个实例的引用。因此,它只会调用实例的方法,'delegate' 指的是(最后分配的值)。
正如@Onejjy 所说,通知将是实现它的好方法。
但是如果你只想使用委托模式。我会说在下载器 clss(委托属性)中放置两个属性并相应地分配它们。然后在需要的地方复制 "invoking delegate method" 代码。
我 运行 想用一个委托注册 2 个不同的 UIViewController,因为我的项目一次显示 2 个 UIViewController。当我触发事件时,我希望两个控制器都得到通知,但不幸的是只有一个控制器可以接收事件,而不是两个。
示例代码如下:
@objc protocol DownloaderDelegate: class {
func complete()
}
class Downloader {
static let sharedInstance = Downloader()
weak var delegate: DownloaderDelegate?
private init() {
}
func downloadFile() {
self.delegate!.complete()
}
}
然后我在两个 UIViewControllers 中都这样使用它:
override viewDidLoad() {
super.viewDidLoad()
Downloader.sharedInstance.delegate = self
}
知道如何让两个视图控制器都监听来自单个委托的事件吗?
它是一个单一的属性,所以那里只能存在一个东西。您有多种选择可以让多个 VC 对某事做出反应。您可以拥有一组委托、订阅和发送通知、拥有一个容器 VC 来管理另外两个 VC 或许多其他方法。
事实上,我认为这里最好的解决方案是从委托模式转移到通知模式(有关 Apple 文档的更多详细信息:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html)。
另一种解决方案是用一组 DownloaderDelegate 替换您的委托。但我真的认为通知解决方案是最干净、最简单的。
Swift NSNotification
上有一篇很好的文章:https://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/
编辑: 你应该注意观察者的移除。最简单的方法是在每个 class 侦听事件中添加:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
不,这不可能。可以这样想。下载器 class 有一个名为 'delegate' 的 属性。 属性 一次只能保存对单个实例的引用。因此,它只会调用实例的方法,'delegate' 指的是(最后分配的值)。
正如@Onejjy 所说,通知将是实现它的好方法。
但是如果你只想使用委托模式。我会说在下载器 clss(委托属性)中放置两个属性并相应地分配它们。然后在需要的地方复制 "invoking delegate method" 代码。