私には2つのVCがあります:CouponVCおよびCouponFeedbackVC。
クーポンVCがbrand:Brand!をそのparentViewControllerから受け取ります。次に、brand.nametoCouponFeedbackVC.
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
}
}
}
CouponFeedbackVC.Swift内
var brandName: String!
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad")
print(brandName)
}
override func awakeFromNib() {
print(brandName)
self.view.layoutIfNeeded()
}
コンソールログ
nil
viewDidLoad
nil
StayUncle
awakeFromNib()-> viewDidLoad()-> prepare(segue :)
CouponFeedbackVCのアウトレットにアクセスしていません。
prepare(for segue:)がviewDidLoad()の後に呼び出されるのはなぜですかおよびawakeFromNib()?
awakeFromNib
では、layoutIfNeeded
を呼び出すために_self.view
_を参照しています。これにより、ビューが読み込まれ、viewDidLoad
が呼び出されます。
_self.view.layoutIfNeeded
_への呼び出しをawakeFromNib
から削除すると、viewDidLoad
はprepare(for:sender:)
の後まで呼び出されません。 layoutIfNeeded
でawakeFromNib
を呼び出す理由はありません。
viewDidLoad()およびawakeFromNib()の前に呼び出されますprepare(for segue:)あるビューコントローラーから別のビューコントローラーにデータを渡すには、オブジェクトを初期化して割り当てる必要があるため、 awakeFromNibが呼び出されると、すべてのアウトレットとアクション接続がすでに確立されていることが保証され、さらにviewDidLoadが呼び出されると、ビューコントローラーがビュー階層をメモリに確実にロードします。これで、あるビューコントローラから別のビューコントローラにデータを渡す準備が整いました。