UINavigationController возвращает ноль Swift - PullRequest
0 голосов
/ 07 апреля 2020

Когда я пытаюсь print(self.navigationController) в viewWillApear или viewDidLoad все в порядке. Но когда делегат возвращает ответ от API print(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)
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Спасибо @Manoj за ответы, это меня остановило. Но я нашел решение в другом. Помимо SurveyList у меня есть UserMenu, где я создаю static let контроллеры представления. Удаление static Я решил мою проблему.

0 голосов
/ 07 апреля 2020
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()
        }
    }
}

Смысл sh заключается в том, что вы вызываете метод для освобожденного объекта.

Вот как это исправить: сделайте ваш делегат слабым и вы правильно освободите объекты

weak var delegate: APIDataDelegate?
...