从超级视图中删除子视图时未调用ViewWillDisappear

问题描述 投票:0回答:2

ViewWillDisappear不会在tabBarViewController中从超级视图中删除子视图时调用。

在这里,我正在共享代码以了解如何删除子视图。

 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() {

    }

}

当时删除子视图时,我应该向该视图控制器注销已添加的观察者。

swift uitabbarcontroller subview swift5
2个回答
0
投票

如果您通过替换窗口的根视图控制器强行拆除了整个视图控制器层次结构,则不会调用[viewWillDisappear

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

您不应该那样做。但是,如果您要执行此操作,则不会调用viewWillDisappear也就不足为奇了。 但是现在让我们问您需要viewWillDisappear。在现代的iOS中,您无需调用NotificationCenter.default.removeObserver,因此该示例没有意义。

而且,当你说的时候

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

任何现有的视图控制器都应该不存在了,它们的deinit将被调用。如果需要,可以将其用作视图控制器被拆除的信号。

如果正在调用deinit

不是

,则表明您有保留周期。但是,that是您需要解决的问题。您的问题没有提供任何相关信息,因此无法提供详细帮助。 仅举一个例子,计时器通常是保留周期的原因。但这很容易解决:无需调用

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

您打电话

scheduledTimer(withTimeInterval:repeats:block:)

并在[weak self]中使用block

0
投票
只需将委托提供给您的超级视图控制器的视图,然后ViewWillDisappear将作为传递self的委托将其呈现给subView来工作。
© www.soinside.com 2019 - 2024. All rights reserved.