我正在使用其中声明了协议的Service类。该协议由两个视图控制器DashboardVCDashboardDetailVC实现。从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并发布通知

希望对您有帮助

10-04 16:36