ios - 使用 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 = "-"
}
}
}
解决方案
我假设您通过 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中放置三个断点来测试我的理论:
- 来自 submitButton IBAction func 的 validateEventPasscode() 处的第 134 行;
- 来自 validateEventPasscode() 函数的 self.performSegue(withIdentifier: "showEventDashboard", sender: self) 的第 190 行;
- dashBoardController.event 的第 108 行 = 来自 prepare(for segue, sender) func 的事件;
错误的执行顺序:1、3、2——如果我的理论是正确的,我会期望这个;所需的执行顺序:1、2、3。
长话短说,你在你self.event
之后填充perfomSegue
并进入下一个屏幕,这就是你在下一个VCevent
中为nil的原因。
我用你的仓库中的 ViewController.swift 文件作为参考:ViewController.swift
希望有帮助,加油!
推荐阅读
- android - Play 商店中的广告部分为空
- java - 如何从 Netbeans 中使用 Java 的 Web 服务获得答案?
- python - plotnine 不添加图例
- c++ - 内部函数是否在 C++ 中自动声明?
- drupal - 我如何为经过身份验证的用户提供管理员链接(管理员的人员选项卡)[Drupal]
- python-3.x - Azure Functions 日志记录 - 模块级别的日志信息
- python - 如何将类类型转换为字符串 selenium python
- java - 尝试加载序列化对象时遇到问题
- node.js - node.js:向 TCP 套接字发送和接收字节
- javascript - bootbox 正在停止下拉菜单工作