【问题标题】:Deinit UIViewController after adding it as a subview将 UIViewController 添加为子视图后取消初始化 UIViewController
【发布时间】:2020-02-11 23:06:34
【问题描述】:

我需要添加一个viewcontroller作为mt当前视图的子视图,但是在我不再需要它之后无法deinit

       let viewController = CountrySelectViewController()
        viewController.view.frame = self.view.bounds

        viewController.view.alpha=0

        self.view.addSubview(viewController.view)

        UIView.animate(withDuration: 0.25, delay: 0.0, options: [], animations: {
            viewController.view.alpha=1

        }, completion: { (finished: Bool) in
        })

        viewController.completionHandlerClose = {

            UIView.animate(withDuration: 0.25, delay: 0.0, options: [], animations: {
                viewController.view.alpha=0

            }, completion: { (finished: Bool) in

                viewController.view.removeFromSuperview()
                viewController.view = nil
            })

        }

【问题讨论】:

  • 使其可以为空,然后如果你想取消初始化,那么将它的值设置为 nil
  • 我怎样才能让它为空?
  • yourController = nil
  • 'nil' 不能分配给类型 'CountrySelectViewController'
  • 这样描述你的控制器 var yourController:CountryController?

标签: ios swift uiviewcontroller deinit


【解决方案1】:

有一个明显的强引用循环,必须使用weak 引用来打破:

viewController.completionHandlerClose = { [weak viewController] in
    guard let controller = viewController else { return }
    UIView.animate(
        withDuration: 0.25,
        delay: 0.0,
        options: [],
        animations: {
           controller.view.alpha = 0
        },
        completion: { _ in
            controller.view.removeFromSuperview()
            controller.view = nil
        }
    )
}

https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

【讨论】:

  • 这样,它只是在将其添加为子视图后得到 deinit,而不是在我关闭它时......
  • @F79 看来您不知道如何使用控制器。如果只使用视图,为什么还要创建控制器?
  • 它不仅仅是一个视图,它还有方法和其他东西,这只是因为在iOS13模式视图不是全屏的,它们看起来像卡片,我需要它全屏显示...跨度>
  • @F79 可以使用控制器的演示样式进行更改。您实际上并没有将控制器添加到层次结构中,这是一件危险的事情。
  • @F79 你错了。只有 default 值已更改。您始终可以将其设置为.fullScreen.overFullScreen。默认值为.automatic,在iOS 13 上等于.pageSheet
猜你喜欢
  • 2019-09-18
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多