使用动画更改 rootController 时崩溃

Posted

技术标签:

【中文标题】使用动画更改 rootController 时崩溃【英文标题】:Crash, when change rootController with animation 【发布时间】:2017-01-19 14:33:03 【问题描述】:

我使用这个函数来改变实际的应用根控制器:

class func setRootController(newController: UIViewController, animation: UIViewAnimationOptions? = nil) 

    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    if animation != nil 

        let currentController = appDelegate.window!.rootViewController!

        UIView.transition(from: currentController.view, to: newController.view, duration: 0.6, options: animation!, completion:  (completed) in
            appDelegate.window?.rootViewController = newController
        )


     else 
        appDelegate.window?.rootViewController = newController
    

我的控制器将出现(使用 setRoot 时调用两次:1 - 当控制器创建和动画开始时,2 - 在完成块中):

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    balanceView.bonuses = bonuses

我的 balanceView(只是一个 UIView)包含 bonusesStack (stackView) 和使用 didSet 的 var 奖励:

var bonuses: [Bonus]! 
    didSet 

        for subview in bonusesStack.arrangedSubviews 
            bonusesStack.removeArrangedSubview(subview)
            subview.removeFromSuperview()
        

        bonuses.forEach  (bonus) in
            let bonusView = BonusBalanceView.loadFromXib(bonus: bonus)

            bonusesStack.addArrangedSubview(bonusView)
        
    


class func loadFromXib(bonus: Bonus) -> BonusBalanceView 
    let bonusView = Bundle.main.loadNibNamed(String(describing: BonusBalanceView.self), owner: nil, options: nil)?.first as! BonusBalanceView
    // some code here
    return bonusView

当第二次调用 willAppear 时,代码在subview.removeFromSuperview() 行崩溃(第二次 bcs,superview 为零。我尝试添加 if 块进行 superview 检查,但由于某些原因它总是执行 O_o)

如果我注释/删除此行(不建议这样做,bcs 视图仍在 stackView 子视图中),代码在完成块中崩溃

【问题讨论】:

【参考方案1】:

问题出在我的自定义视图中。我重写了 draw 方法并以编程方式处理图层。在 xib 文件中,此视图包含子视图。不知何故(¯\_(ツ)_/¯)这个层和子视图冲突和崩溃应用程序

【讨论】:

以上是关于使用动画更改 rootController 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何解决内存崩溃

打开网站时,ipad 和 iphone 浏览器崩溃

插入和删除时发生 UItableview 动画崩溃

在 RootController 上调整 UITableView 的大小

滚动列表时 SwiftUI 崩溃

从 rootcontroller 到 detailcontroller (UINavigationController) 的 TableView 索引