我正在使用其中声明了协议的Service类。该协议由两个视图控制器DashboardVC
和DashboardDetailVC
实现。从DashboardVC
调用协议可以正常工作。然后在DashboardDetailVC
中,它也可以正常工作在DashboardDetailVC
中定义的调用协议方法。但是,当我关闭DashboardDetailVC
并移回DashboardVC
时,就会调用DashboardDetailVC
的协议方法。我的代码是:
Service.swift
protocol DashboardDelegate {
func dashboardInfoResponse(data: [String: Any])
}
class Service {
var dashboardDelegate: DashboardDelegate?
func hitWebRequest(api: String, request: URLRequest) {
..
self.dashboardDelegate?.dashboardInfoResponse(data: dataArray)
..
}
}
DashboardVC.swift
class DashboardVC: DashboardDelegate {
override func viewDidLoad() {
super.viewDidLoad()
Service.shared().dashboardDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
Service.shared().dashboardInfo(postData: token)
}
func dashboardInfoResponse(data: [String : Any]) {
..
..
}
DashboardDetailVC.swift
class DashboardDetailVC: DashboardDelegate {
override func viewDidLoad() {
super.viewDidLoad()
Service.shared().dashboardDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
Service.shared().dashboardInfo(postData: token)
}
func dashboardInfoResponse(data: [String : Any]) {
..
..
}
当我从
DashboardDetailVC
返回到DashboardVC
时,使用dismiss(animated: true, completion: nil)
从
DashboardVC
调用协议方法,但仍然在dashboardInfoResponse
中返回DashboardDetailVC
协议方法。 最佳答案
这很明显,您有了Service
类,该类具有sharedInstance
,这意味着在整个应用程序周期中只能使用单个对象。而且,只有单个委托属性在所有人之间共享。
观察一下
您将DashboardVC
设置为viewDidLoad
中的delegate
中的self
,这意味着它指向DashboardVC
之后,您提供DashboardDetailVC
,然后将delegate
设置为self
,这意味着它指向DashboardDetailVC
之后,即使您关闭VC,您的所有委托调用也将转到DashboardDetailVC
而不是DashboardVC
解决此问题的方法:您可以选择。
1)不要使用共享实例
2)改为在ViewWillAppear
中设置委托。
3)使用NotificationCenter并发布通知
希望对您有帮助