【问题标题】:Delegate method not called properly未正确调用委托方法
【发布时间】:2018-06-25 23:25:37
【问题描述】:

我正在使用声明协议的服务类。该协议由两个视图控制器实现,即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中的协议方法,但还是返回了DashboardDetailVC中的dashboardInfoResponse协议方法。

【问题讨论】:

  • 可能在你dismiss detail VC之后,delegate sign没有变回来,viewDidLoad方法可能不会每次都运行,只有这个时候需要“load”作业,就是这样,delegate属性没有被覆盖根据您的需要
  • 是的,这就是问题所在,thnx

标签: ios swift methods delegates protocols


【解决方案1】:

这很明显,你有 Service 类,它有 sharedInstance,这意味着在整个应用程序周期中只使用了一个对象。并且只有一个委托属性在所有之间共享。

注意

DashboardVC in viewDidLoad 你将delegate 设置为self,这意味着它指向DashboardVC

在您呈现DashboardDetailVC 之后,您将delegate 设置为self,这意味着它指向DashboardDetailVC

之后,即使您解雇了 VC,您的所有代表呼叫也将转到 DashboardDetailVC 而不是 DashboardVC

要解决这个问题:您可以选择。

1) 不要使用共享实例

2) 改为在ViewWillAppear 中设置委托。

3) 使用 NotificationCenter 并发布通知

希望对你有帮助

【讨论】:

  • 感谢@Prashant,当我使用单例时,委托肯定需要在“ViewWillAppear”中分配给自己。
  • @omi23 欢迎快乐编码:)
  • @omi23 你为什么要推翻你的投票?解决方案对您没有帮助吗?
  • 哦,我双击了,我的错
  • @omi23 不是问题,感谢您接受回答:)
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多