j'utiliser cette fonction pour changer l'application contrôleur racine réelle:accident, lorsque le changement rootController avec animation
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
}
}
Mon contrôleur willAppear (appelé deux fois lors de l'utilisation setRoot: 1 - lorsque le contrôleur créé et l'animation commence, 2 - bloc d'achèvement):
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
balanceView.bonuses = bonuses
}
Mon balanceView (juste un UIView) contient bonusesStack (stackView) et les primes var avec didSet:
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
}
Lorsque willAppear est appelé une deuxième fois, le code se bloque à la ligne subview.removeFromSuperview()
(bcs à la deuxième fois, superview est nul. J'essaie d'ajouter si le bloc pour le contrôle de superview, mais pour certaines raisons, il exécuter toujours O_o)
Si je commente/supprimer cette ligne (qui n'est pas recommandé, bcs afficher encore stackView sous-vue), les accidents de code dans le bloc d'achèvement