委托方法未正确调用

时间:2018-01-17 06:41:51

标签: ios swift methods delegates protocols

我正在使用声明协议的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协议方法。

1 个答案:

答案 0 :(得分:2)

这很明显你有ServicesharedInstance,这意味着在整个应用程序循环中只使用了单个对象。并且只有单个委托属性在所有应用程序之间共享。

观察

DashboardVC viewDidLoad中{p> delegateself设置为DashboardVC,这意味着它指向DashboardDetailVC

之后你出现delegate,你将self设置为DashboardDetailVC,这意味着它指向DashboardDetailVC

之后,即使您解雇VC,您的所有代表电话也会转到DashboardVC而不是ViewWillAppear

要解决此问题:您有选择权。

1)不要使用共享实例

2)代之以{{1}}设置委托。

3)使用NotificationCenter并发布通知

希望它对你有所帮助