ViewWillDisappear не вызывается при удалении вспомогательного представления из суперпредставления - PullRequest
0 голосов
/ 29 января 2020

ViewWillDisappear не вызывается при удалении подпредставлений из суперпредставления во вкладке BarViewController.

Здесь я делюсь кодом, чтобы понять, как я удаляю подпредставления.

 AppDelegate.sharedApp().window?.subviews.forEach({ (view) in
     view.removeFromSuperview()
 })

 AppDelegate.sharedApp().window?.rootViewController = viewController
 AppDelegate.sharedApp().window?.makeKeyAndVisible()

В tabBarViewController viewWillDisappear viewDidDisappear не вызывается. Пожалуйста, помогите мне, как сделать вызов viewWillDisappear, viewDidDisappear в вышеупомянутом сценарии. Спасибо.

Здесь, совместно с кодом tabBarViewController,

class MyTabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func viewWillAppear(_ animated: Bool) {
        NotificationCenter.default.addObserver(self, selector: #selector(checkData), name: NSNotification.Name(rawValue: "dataCheck"), object: nil)
        super.viewWillAppear(true)
    }

    override func viewWillDisappear(_ animated: Bool) {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "dataCheck"), object: nil)
        super.viewWillDisappear(true)
    }

    @objc func checkData() {

    }

}

При удалении подпредставления в то время я должен отменить регистрацию добавленных наблюдателей в этом контроллере представления.

Ответы [ 2 ]

1 голос
/ 29 января 2020

viewWillDisappear не вызывается, если вы принудительно разрушаете всю иерархию контроллера представления, заменяя root контроллер представления окна:

 AppDelegate.sharedApp().window?.rootViewController = viewController

Вы не должны этого делать. Но если вы собираетесь это сделать, неудивительно, что viewWillDisappear не вызывается.

Но теперь давайте спросим, ​​для чего вам нужно viewWillDisappear. Вам не нужно вызывать NotificationCenter.default.removeObserver в современном iOS, поэтому пример не имеет смысла.

Более того, когда вы говорите

 AppDelegate.sharedApp().window?.rootViewController = viewController

, любые существующие контроллеры представления должны go выйти существования и их deinit будет называться. Вы можете использовать это как сигнал о том, что контроллер представления снят, если он вам нужен.

Если ваш deinit является не вызываемым, это признак того, что у вас есть сохранить цикл. Но тогда , что - это проблема, которую вам нужно решить. Ваш вопрос не дает никакой информации об этом, поэтому невозможно помочь в деталях.

Просто для примера, Таймер часто является причиной цикла сохранения. Но это легко исправить: вместо звонка

scheduledTimer(timeInterval:target:selector:userInfo:repeats:)

вы звоните

scheduledTimer(withTimeInterval:repeats:block:)

и используете [weak self] в block.

0 голосов
/ 30 января 2020

просто передайте делегата этому представлению вашего контроллера суперпредставления, и тогда ViewWillDisappear будет работать как проходящий делегат себя, предоставляющий его присутствие в subView.

...