当我展开我的第二个视图控制器时,第一个视图控制器中的所有变量都变为空
when i unwind my second view controller all variables in the first view controller become empty
我正在处理具有多个视图控制器的项目,其中一个视图控制器具有许多文本字段和一个按钮,当您单击该按钮时,它会将您带到另一个具有地图视图的视图控制器。当用户在地图上选择一个地方然后尝试返回到第一个视图控制器时,先前填充的文本字段为空。
我如何返回原始视图控制器并找到文本字段和选择器视图仍然保留在 segue 之前最初输入的相同值。
这是我如何继续第二个 VC
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toOnlyMap" {
let distenation = segue.destination as? onlyMapVC
distenation?.latitude = latitude
distenation?.longitude = longitude
}
}
@IBAction func toMapClicked(_ sender: UIButton) {
performSegue(withIdentifier: "toOnlyMap", sender: self)
}
这是我如何展开第二个 VC
@IBAction func unwindToAdd(_ sender:UIStoryboardSegue) {
if latitude == 0.0 || longitude == 0.0 {
Helper.showAlert("Error", message: "you did not choose any place click back to dismiss this page", VC: self)
} else {
performSegue(withIdentifier: "backFromMap", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "backFromMap" {
let destination = segue.destination as? addNotificationVC
destination?.latitude = latitude
destination?.longitude = longitude
destination?.color = "Ggreen"
destination?.theHint = "you have choose the location"
}
}
很高兴看到新人进入该领域。我建议您阅读名为 "MVC" 的东西,它代表模型-视图-控制器。您遇到的问题存在是因为您没有任何模型。你只有一堆视图和几个控制器。
这些"many text fields"代表什么?它是关于用户的信息,还是相机元数据或其他完全不同的东西?在您的视图控制器中创建一个模型,并在用户输入信息时填写它。
您的第二个视图控制器中似乎有某种模型:latitude
和 longitude
但第一个 VC 中没有。
问题是,您称为“展开”转场的东西不是实际上是展开。您正在制作一个完整的 new 第一个 VC,将其堆叠在现有的第二个 VC 和现有的第一个 VC 之上。那会造成很多问题,比如内存浪费。因此,新的 VC 以空文本字段开始使用(因为它是新的);但这只是更深层次问题的症状!与此同时,旧的 VC 仍然坐在那里,它的“填充文本字段”隐藏在另外两个视图控制器和它们的视图后面。
您可以通过执行错误的“展开”然后查看 View Debugger 轻松确认这一点。您实际上会在层次结构中看到第一个 VC 的两个副本。
另一个证明是在第一个 VC 中登录 viewDidLoad
。如果您的 "unwind" segue 导致 viewDidLoad
被调用,则它不是 unwind segue — 您正在创建一个新的第一个 VC.
我正在处理具有多个视图控制器的项目,其中一个视图控制器具有许多文本字段和一个按钮,当您单击该按钮时,它会将您带到另一个具有地图视图的视图控制器。当用户在地图上选择一个地方然后尝试返回到第一个视图控制器时,先前填充的文本字段为空。
我如何返回原始视图控制器并找到文本字段和选择器视图仍然保留在 segue 之前最初输入的相同值。
这是我如何继续第二个 VC
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toOnlyMap" {
let distenation = segue.destination as? onlyMapVC
distenation?.latitude = latitude
distenation?.longitude = longitude
}
}
@IBAction func toMapClicked(_ sender: UIButton) {
performSegue(withIdentifier: "toOnlyMap", sender: self)
}
这是我如何展开第二个 VC
@IBAction func unwindToAdd(_ sender:UIStoryboardSegue) {
if latitude == 0.0 || longitude == 0.0 {
Helper.showAlert("Error", message: "you did not choose any place click back to dismiss this page", VC: self)
} else {
performSegue(withIdentifier: "backFromMap", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "backFromMap" {
let destination = segue.destination as? addNotificationVC
destination?.latitude = latitude
destination?.longitude = longitude
destination?.color = "Ggreen"
destination?.theHint = "you have choose the location"
}
}
很高兴看到新人进入该领域。我建议您阅读名为 "MVC" 的东西,它代表模型-视图-控制器。您遇到的问题存在是因为您没有任何模型。你只有一堆视图和几个控制器。
这些"many text fields"代表什么?它是关于用户的信息,还是相机元数据或其他完全不同的东西?在您的视图控制器中创建一个模型,并在用户输入信息时填写它。
您的第二个视图控制器中似乎有某种模型:latitude
和 longitude
但第一个 VC 中没有。
问题是,您称为“展开”转场的东西不是实际上是展开。您正在制作一个完整的 new 第一个 VC,将其堆叠在现有的第二个 VC 和现有的第一个 VC 之上。那会造成很多问题,比如内存浪费。因此,新的 VC 以空文本字段开始使用(因为它是新的);但这只是更深层次问题的症状!与此同时,旧的 VC 仍然坐在那里,它的“填充文本字段”隐藏在另外两个视图控制器和它们的视图后面。
您可以通过执行错误的“展开”然后查看 View Debugger 轻松确认这一点。您实际上会在层次结构中看到第一个 VC 的两个副本。
另一个证明是在第一个 VC 中登录 viewDidLoad
。如果您的 "unwind" segue 导致 viewDidLoad
被调用,则它不是 unwind segue — 您正在创建一个新的第一个 VC.