首页 > 解决方案 > 使用 Segue 从以前的 View Controller 传递到另一个 View Controller 时,数据变为 Nil

问题描述

我即将使用 segue将数据从ViewController传递到另一个ViewController 。通过第一个视图控制器中的断点从变量检查数据(事件)时,数据(事件)不为零。但是当我检查第二个视图控制器时,数据(事件)是nil。我很困惑是因为我的代码中有错误,还是因为我的控制台中出现了Unable to insert COPY_SEND的错误。希望我能从你那里得到一些帮助。谢谢

显示事件和密码的第一个视图控制器有数据

显示事件和密码的第二个视图控制器为零

从第一个视图控制器开始

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "DashBoardViewController" {
        let dashBoardController = segue.destination as! DashBoardViewController
        dashBoardController.self.event = event
        dashBoardController.self.passcode = passcode
    }
}

事件和密码为零

override func viewDidLoad() {
    super.viewDidLoad()
    guard event != nil, passcode != nil else {
        _ = SCLAlertView(appearance: appearance).showError("No Event Details", subTitle: "There's no event details, please logout and try again")
        return
    }
    showEventDetails()
}

显示事件详情

func showEventDetails() {
    DispatchQueue.main.async{
        self.eventNameLabel.text =  "\(self.event.name.uppercased())"
        self.locationLabel.text =  "\(self.event.location.uppercased())"
        if let dateStringFromDate = getFormattedStringFromDate(date: (self.event.startDateTime), formatString: "MMMM dd, yyyy/ hh:mm a") {
            self.dateTimeLabel.text = dateStringFromDate
        } else {
            self.dateTimeLabel.text = "-"
        }
    }
}

标签: iosswiftsegueuistoryboardsegue

解决方案


我假设您通过 Interface Builder 将 segue 链接到您的 submitButton 上的DashBoardViewController,这意味着当您点击提交按钮时, @IBAction func submitButton(_ sender: UIButton) { }会调用,您可以在其中检查您的密码是否可以使用,如果可以,您正在调用validateEventPasscode()哪个调用 API 端点(异步),并且只有在那里填充self.event = event(ViewController.swift 中的第 187 行)。

现在,真正发生的是,当您通过 IB(界面构建器)从按钮链接一个 segue 时,内部将有一个执行 segue,我们必须通过覆盖ViewController.swift中的以下方法来停止:source

func shouldPerformSegue(withIdentifier identifier: String, 
                 sender: Any?) -> Bool {
    return false
}

这样您从第 190 行调用 - ViewController.swift:

self.performSegue(withIdentifier: "showEventDashboard", sender: self)

是那个开火的:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if segue.identifier == "DashBoardViewController" {
         let dashBoardController = segue.destination as!  DashBoardViewController
         dashBoardController.event = event
         dashBoardController.passcode = passcode
     }
   }

您可以通过在ViewController.swift中放置三个断点来测试我的理论:

  1. 来自 submitButton IBAction func 的 validateEventPasscode() 处的第 134 行;
  2. 来自 validateEventPasscode() 函数的 self.performSegue(withIdentifier: "showEventDashboard", sender: self) 的第 190 行;
  3. dashBoardController.event 的第 108 行 = 来自 prepare(for segue, sender) func 的事件;

错误的执行顺序:1、3、2——如果我的理论是正确的,我会期望这个;所需的执行顺序:1、2、3。

长话短说,你在你self.event之后填充perfomSegue并进入下一个屏幕,这就是你在下一个VCevent中为nil的原因。

我用你的仓库中的 ViewController.swift 文件作为参考:ViewController.swift

希望有帮助,加油!


推荐阅读