Swift 4:在 viewDidLoad 之后调用 prepare(for segue:)

Posted

技术标签:

【中文标题】Swift 4:在 viewDidLoad 之后调用 prepare(for segue:)【英文标题】:Swift 4: prepare(for segue:) being called after viewDidLoad 【发布时间】:2017-10-07 07:22:41 【问题描述】:

我有 2 个 VC:CouponVCCouponFeedbackVC

Coupon VC 从其 parentViewController 接收 brand: Brand!。 现在我想将 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
        
    

在 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(for segue:)

我没有从 CouponFeedbackVC 访问任何网点。

为什么 prepare(for segue: )viewDidLoad()awakeFromNib() 之后被调用?

【问题讨论】:

你是如何从 CouponVC 执行 segue 操作的?使用故事板推送操作或使用 performSegueWithIdentifier ? 【参考方案1】:

awakeFromNib 中,您引用self.view 以便调用layoutIfNeeded。这会导致加载视图并调用viewDidLoad

如果您从awakeFromNib 中删除对self.view.layoutIfNeeded 的调用,那么直到prepare(for:sender:) 之后才会调用viewDidLoad。没有理由在awakeFromNib 中调用layoutIfNeeded

【讨论】:

【参考方案2】:

viewDidLoad() 和 awakeFromNib()prepare(for segue: ) 之前调用,因为要将数据从一个视图控制器传递到另一个视图控制器,您必须初始化并分配所以当 awakeFromNib 被调用时,它保证已经建立了它的所有出口和动作连接,然后 viewDidLoad 被调用,这保证了视图控制器已经加载了它的视图层次结构进入记忆。现在它可以将数据从一个视图控制器传递到另一个视图控制器了。

【讨论】:

以上是关于Swift 4:在 viewDidLoad 之后调用 prepare(for segue:)的主要内容,如果未能解决你的问题,请参考以下文章

Viewdid加载和卸载

Swift 4:在 viewDidLoad 之后调用 prepare(for segue:)

Swift:tableView.reloadData() 太慢了

swift 4 timeIntervalSinceReferenceDate 而不是 JSONSerialization 之后的实际日期字符串

Xcode 7 不显示 swift 2 的函数调用者

Swift 4.0.2 中的 NSObject setValuesForKeys 编码投诉错误