使用 Segue 从前一个 View Controller 传递到另一个 View Controller 时,数据变为 Nil

Posted

技术标签:

【中文标题】使用 Segue 从前一个 View Controller 传递到另一个 View Controller 时,数据变为 Nil【英文标题】:Data turns Nil when passing from previous View Controller going to another View Controller using Segue 【发布时间】:2018-08-29 01:52:54 【问题描述】:

我即将使用 segue 将数据从一个 ViewController 传递到另一个 ViewController。当通过 1st View Controller 中的断点从变量检查数据(事件)时,数据(事件)不为零。但是当我检查 2nd View Controller 时,数据(事件)是 nil。我很困惑是因为我的代码中有错误,还是因为我的控制台中出现了无法插入 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
    

事件和密码变为 Nil

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()

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 = "-"
        
    

【问题讨论】:

我使用你的代码,它工作正常。尝试分别检查您的值。分享你完整的代码,然后我可以帮忙。 @AlexKolovatov 我的代码有什么问题? Unable to insert COPY_SEND 错误出现在我的控制台中。这是错误吗?如何与您分享我的代码? 只需将您的项目存档并放入保管箱,然后给我发送链接。 @AlexKolovatov github.com/pdgoyal/RegistrAsian 可以吗? 是的,没关系。稍后我会检查你的代码。 【参考方案1】:

我假设您通过 Interface Builder 将转到您的 submitButton 上的 DashBoardViewController 的 segue 链接,这意味着当您点击提交按钮时,@IBAction func submitButton(_ sender: UIButton) 被调用,您可以在其中检查是否您的 passcode 很好,如果是这样,您正在调用 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 中放置三个断点来测试我的理论:

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

错误的执行顺序:1、3、2 - 如果我的理论是正确的,我现在可以预料到; 所需的执行顺序:1、2、3。

长话短说,您在perfomSegue 之后填充您的self.event 并转到下一个屏幕,这就是为什么您的event 在下一个屏幕中是nil 风险投资

我使用来自您的仓库的 ViewController.swift 文件作为参考:ViewController.swift

希望对你有帮助,干杯!

【讨论】:

【参考方案2】:

用这个替换 FirstViewController 中的 prepareForSegue 方法

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

你不需要写

dashBoardController.self.event = event
dashBoardController.self.passcode = passcode

只需从上面两行中删除 self

【讨论】:

你能告诉我为什么你使用 dashBoardController.self.event 而不是 dashBoardController.event 这不是我的问题,我不这样做,但问题不在这里。我刚刚检查过了。 @MuhammadKhalikurRehman 我尝试了您建议的解决方案,但它对我不起作用。

以上是关于使用 Segue 从前一个 View Controller 传递到另一个 View Controller 时,数据变为 Nil的主要内容,如果未能解决你的问题,请参考以下文章

使用 segue 在 View Controller 之间传递变量

使 popover segue 的 View Controller 保持持久(仅分配一个实例)

通过 Collection View Cell Swift 中的 segue 将图像传递给另一个视图控制器

Xcode Segue View Controller 从右到左没有 UINavigation

从前一个 View Controller 中的数组中获取数据,将其放入另一个 TableViewController

手动模态segue不起作用,View Controller不在窗口层次结构中?