iosswiftdelegatesswift5

UINavigationController return nil Swift


When I try print(self.navigationController) in viewWillApear or viewDidLoad all ok. But when delegate return response from API print(self.navigationController) return nil. What could it be?

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)
        }
    }
    
}

Solution

  • 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()
            }
        }
    }
    

    The crash is because you are calling the method on deallocated object.

    Here is how to fix this: Make your delegate is weak and you are correctly deallocating the objects

    weak var delegate: APIDataDelegate?