首页 > 解决方案 > UINavigationController 返回 nil Swift

问题描述

当我尝试或一切正常print(self.navigationController)时。但是当委托从 API 返回响应时返回。会是什么呢?viewWillApearviewDidLoadprint(self.navigationController)nil

extension EnterpriseList: APIDataDelegate {
    func successRequest() { //print(self.navigtionController) == nil
        DispatchQueue.main.async {
            self.navigationController?.popToRootViewController(animated: true)
        }
    }

    func badRequest() {
        DispatchQueue.main.async {
            Alert.showWarningAlert(withTitle: "Внимание!", andMessage: "Ошибка получения данных, попробуйте чуть позже", whereSender: self)
        }
    }

}

标签: iosswiftapidelegatesswift5

解决方案


class EnterpriseList: UIViewController {
     let dataSource = DataSource()

     override func viewDidLoad() {
        super.viewDidLoad()
        dataSource.delegate = self
        dataSource.makeAPICall()
     }
  }

   extension EnterpriseList: APIDataDelegate {
      func successRequest() {
          DispatchQueue.main.async {
            self.navigationController!.popToRootViewController(animated: true)
        }
   }

   func badRequest() {
      DispatchQueue.main.async {
      }
   }
}

protocol APIDataDelegate: class {
    func successRequest()
    func badRequest()
}

class DataSource {
    var delegate: APIDataDelegate?

    private let queue = DispatchQueue(label: "Test", qos: .background, attributes: [], autoreleaseFrequency: .inherit, target: nil)

    func makeAPICall() {
        queue.asyncAfter(deadline: .now() + 2) {[weak self] in
            self?.delegate?.successRequest()
        }
        queue.asyncAfter(deadline: .now() + 10) {[weak self] in
            self?.delegate?.successRequest()
        }
    }
}

崩溃是因为您在已释放对象上调用该方法。

以下是解决此问题的方法:使您的委托很弱,并且您正在正确地释放对象

weak var delegate: APIDataDelegate?

推荐阅读