在出现新控制器后,控制器不会退出

时间:2018-06-12 14:54:42

标签: ios swift uiviewcontroller

我有FakeSplashController执行一些网络请求,然后打开WelcomeViewController。当我在WelcomeViewController中查看记忆图时,我发现SplashViewController仍在那里。我在deinit中调用FakeSplashController函数来检查它是否正在拒绝,但它没有调用它。可能是什么问题?

WelcomeViewController中我在记忆中看到的内容: enter image description here

FakeSplashController:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    setupUI()
    networkRequests()

}

func networkRequests(){

    AppInitService().initAppRequest { [](result) in
        switch result{
        case .success(_):
            self.startAnimation()
            return
        case .error(let error):
            UIControlUtil.showErrorMessage(title: error.title, message: error.message, closeButton: true)
            return
        }
    }
}

func openApp(){
        let loginController = WelcomeViewController()
    self.present(loginController, animated: true)
}

func startAnimation(){
    UIView.animate(withDuration: 0.8, animations: {
        self.logoImage.frame.origin.x -= 100
    }, completion: nil)
    UIView.animate(withDuration: 1,delay: 0.3,animations: {
        self.textLogo.alpha = 1
        self.textLogo.frame.origin.x += 50
    }, completion: { _ in
        self.openApp()
    })
}

deinit {
    print("Splash Deinited")
}
编辑:当我在下面发帖时,有人提到了这一点;

  

除非你做一些非常专业的事情,否则你不需要在Swift中取消初始化对象。当引用计数变为0时,它将自动调用。如果您真的需要,您应该能够通过AppDelegate设置窗口的rootViewController。

所以我不需要把它作为一个问题吗? Best way to deinit Initial view controller?

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,你的代码中没有什么奇怪的,这就是iOS框架的工作原理;视图控制器未被释放,因为它仍然是当前窗口的rootViewController。 我不认为非常需要解除分配,但如果你真的需要这样做,解决方案可能是用你的rootViewController替换WelcomeViewController。通过替换它,启动屏幕的引用计数将变为0并将被取消分配。 像

这样的东西
guard let window = UIApplication.shared.keyWindow else {
    return
}
self.dismiss(animated: false, completion: nil)
window.rootViewController = WelcomeViewController()

问题在于没有动画(但你也可以实现动画,只是找到如何动画rootViewController更改)