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 () ?
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
.
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.