使用 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