web-dev-qa-db-ja.com

Swift 4:viewDidLoadの後に呼び出されるprepare(for segue :)

私には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()

6
Aryan Sharma

awakeFromNibでは、layoutIfNeededを呼び出すために_self.view_を参照しています。これにより、ビューが読み込まれ、viewDidLoadが呼び出されます。

_self.view.layoutIfNeeded_への呼び出しをawakeFromNibから削除すると、viewDidLoadprepare(for:sender:)の後まで呼び出されません。 layoutIfNeededawakeFromNibを呼び出す理由はありません。

6
Paulw11

viewDidLoad()およびawakeFromNib()の前に呼び出されますprepare(for segue:)あるビューコントローラーから別のビューコントローラーにデータを渡すには、オブジェクトを初期化して割り当てる必要があるため、 awakeFromNibが呼び出されると、すべてのアウトレットとアクション接続がすでに確立されていることが保証され、さらにviewDidLoadが呼び出されると、ビューコントローラーがビュー階層をメモリに確実にロードします。これで、あるビューコントローラから別のビューコントローラにデータを渡す準備が整いました。

1