2017-01-19 2 views
0

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

Répondre

0

Le problème était dans ma vue personnalisée. J'ai surchargé la méthode dessiner et travailler avec les couches par programmation. Dans le fichier xib, cette vue contient une sous-vue. D'une manière ou d'une autre (¯ \ _ (ツ) _/¯) ce calque et subview conflit et application de crash