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:CouponVC 和 CouponFeedbackVC。
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:)的主要内容,如果未能解决你的问题,请参考以下文章
Swift 4:在 viewDidLoad 之后调用 prepare(for segue:)
Swift:tableView.reloadData() 太慢了
swift 4 timeIntervalSinceReferenceDate 而不是 JSONSerialization 之后的实际日期字符串