具有多个控制器的单个代表

时间:2016-05-06 17:08:38

标签: ios swift delegates swift-protocols

我遇到了一种情况,我希望用一个委托注册2个不同的UIViewControllers,因为我的项目一次显示2个UIViewControllers。当我触发事件时,我希望两个控制器都得到通知,但不幸的是只有两个控制器才能接收到这两个事件。

以下是示例代码:

@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
}

知道如何让两个视图控制器从单个委托中侦听事件吗?

3 个答案:

答案 0 :(得分:5)

事实上,我认为这里最好的解决方案是从委托模式转移到通知模式(有关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/

修改 你应该照顾观察员的移除。最简单的方法是在每个类中添加它来监听事件:

deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
}

答案 1 :(得分:1)

它是一个属性,所以那里只能存在一件事。您有多种方法可以让多个VC对某些事情作出反应。您可以拥有一组代表,订阅和发送通知,拥有管理其他两个VC的容器VC,或许多其他方法。

答案 2 :(得分:0)

不,不可能。可以这样想。下载程序类有一个名为' delegate'的属性。该属性一次只能保存对单个实例的引用。因此,它只会调用实例的方法,即委托'引用(最后指定的值)。

正如@Onejjy所说,通知将是实现它的好方法。

但是如果你想只去代表模式。我会说在下载器clss(委托属性)中放置两个属性并相应地分配它们。然后复制"调用委托方法"代码,无论何时需要。