と変更rootController私は、実際のアプリケーションのルートコントローラを変更するため、この機能を使用して:クラッシュ、アニメーション
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
}
}
私のコントローラwillAppear(setRootを使用するときに二回と呼ばれる:1 - コントローラに作成され、アニメーションが始まり、2 - 中完了ブロック):
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
balanceView.bonuses = bonuses
}
didSetと私のbalanceView(ただのUIView)が含まれbonusesStack(stackView)と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が2回目に呼び出されると、コードsubview.removeFromSuperview()
(2回目はbcs、スーパービューはnil)でクラッシュします。私はスーパービューチェックのためにブロックを追加しようとしましたが、何らかの理由で常にO_oを実行しています)
この行をコメント/削除すると(推奨されていませんが、bcsビューはまだstackViewサブビューにあります)、完了ブロックでコードがクラッシュします