Swift 4:在viewDidLoad

时间:2017-10-07 07:22:42

标签: ios swift segue swift4

我有2个VC: CouponVC CouponFeedbackVC

优惠券VC从其parentViewController接收品牌:品牌!。 现在我想将 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() - >准备(对于segue:)

我没有从CouponFeedbackVC访问任何商店。

为什么在 viewDidLoad() awakeFromNib()之后调用准备(for segue:)

2 个答案:

答案 0 :(得分:5)

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

如果您从awakeFromNib移除对viewDidLoad的来电,则prepare(for:sender:)之后才会调用layoutIfNeeded。没有理由在awakeFromNib中致电adapter.setListener(new CaptionedImagesAdapter.Listener() { @Override public void onClick(int position) { Intent intent = new Intent(getActivity(), SaladDetailActivity.class); intent.putExtra(SaladDetailActivity.EXTRA_SALAD, position+1); getActivity().startActivity(intent); } });

答案 1 :(得分:0)

prepare(对于segue:)之前调用

viewDidLoad()和awakeFromNib(),因为要将数据从一个视图控制器传递到另一个视图控制器,您必须初始化并分配对象因此,当调用 awakeFromNib 时,保证已经建立了所有的插座和操作连接,并且调用了 viewDidLoad ,这确保了视图控制器已加载其视图层次结构进入记忆。现在它已准备好将数据从一个viewcontroller传递到另一个viewcontroller。