我正在使用声明协议的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
协议方法。
答案 0 :(得分:2)
这很明显你有Service
类sharedInstance
,这意味着在整个应用程序循环中只使用了单个对象。并且只有单个委托属性在所有应用程序之间共享。
观察
DashboardVC
viewDidLoad
中{p> delegate
将self
设置为DashboardVC
,这意味着它指向DashboardDetailVC
之后你出现delegate
,你将self
设置为DashboardDetailVC
,这意味着它指向DashboardDetailVC
之后,即使您解雇VC,您的所有代表电话也会转到DashboardVC
而不是ViewWillAppear
要解决此问题:您有选择权。
1)不要使用共享实例
2)代之以{{1}}设置委托。
3)使用NotificationCenter并发布通知
希望它对你有所帮助