web-dev-qa-db-fra.com

Swift 4: prepare (for segue :) appelé après viewDidLoad

J'ai 2 VCs: CouponVC et CouponFeedbackVC .

Le coupon VC reçoit marque: Marque! de son parentViewController . Maintenant, je veux passer le brand.name à CouponFeedbackVC .

CouponVC.Swift

var brandName: String!
override func viewDidLoad() {
    super.viewDidLoad
    brandName = brand.name
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "couponToFeedBack" {
        if let vc = segue.destination as? CouponFeedbackVC {
            print(brandName)
            vc.brandName = self.brandName
        }
    }
}

Dans CouponFeedbackVC.Swift

var brandName: String!
override func viewDidLoad() {
    super.viewDidLoad()
    print("viewDidLoad")
    print(brandName)
}

 override func awakeFromNib() {
    print(brandName)
    self.view.layoutIfNeeded()
}

Journal de la console

nil
viewDidLoad
nil
StayUncle

awakeFromNib () -> viewDidLoad () -> prepare (pour segue :)

Je n'accède à aucun point de vente de CouponFeedbackVC.

Pourquoi prepare (for segue:) est-il appelé après viewDidLoad () et awakeFromNib () ?

4
Aryan Sharma

Dans awakeFromNib, vous référencez self.view pour appeler layoutIfNeeded. Cela provoque le chargement de la vue et l'appel de viewDidLoad

Si vous supprimez l'appel à self.view.layoutIfNeeded de awakeFromNib, viewDidLoad ne sera appelé qu'après le prepare(for:sender:). Il n'y a aucune raison d'appeler layoutIfNeeded dans awakeFromNib

5
Paulw11

viewDidLoad () et awakeFromNib () sont appelés avant prepare (for segue:) car pour passer des données d'un contrôleur de vue à un autre, vous devez initialiser et allouer l'objet. Ainsi, lorsque awakeFromNib est appelé, il est garanti que toutes ses connexions de sortie et d’action sont déjà établies et que viewDidLoad est appelé, ce qui donne l’assurance que le contrôleur de vue a chargé sa hiérarchie de vues en mémoire. Il est maintenant prêt à transmettre des données d’un contrôleur de vue à un autre.

0