【问题标题】:Data is lost after switching views切换视图后数据丢失
【发布时间】:2019-02-21 17:34:21
【问题描述】:

在屏幕 A 中,我从用户那里收集数据,然后使用准备转场功能将其显示在屏幕 B 上。然后我注意到如果用户转到屏幕 C,然后返回屏幕 B,数据就消失了。我如何将数据保存在那里。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textInput: UITextField!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let a : BViewController = segue.destination as! BViewController
        a.honey = textInput.text!
    }
}

import UIKit

class BViewController: UIViewController {

    @IBOutlet weak var x: UILabel!

    var honey:String = "default"
    override func viewDidLoad() {
        super.viewDidLoad()
        x.text = honey
    }
}

【问题讨论】:

  • 你怎么去第三个视图控制器然后回来?似乎您可能正在创建 B 的新实例。
  • @RakeshaShastri 看故事板图片。我只是控制将屏幕 B 上的按钮拖动到屏幕 C 并创建一个 segue
  • 对,您正在创建B的新实例。您可以在B的viewDidLoad中设置断点并确保。 ViewDidLoad 在初始化之后只被调用一次,所以在你的情况下,它会在你按下 C 中的按钮后再次调用。尝试使用 UINavigatoinController - 也许这是你需要的
  • @RakeshaShastri 有没有办法在不使用 UINavigationController 的情况下不创建 B 的新实例
  • 欢迎来到 StackOverflow。请阅读How to Askminimal reproducible example,然后阅读edit 您的问题,其中显示了说明问题的minimum 代码。即删除空方法和模板 cmets。

标签: ios swift user-interface uiviewcontroller


【解决方案1】:

然后我注意到如果用户转到屏幕 C,然后返回屏幕 B,数据就消失了。我如何将数据保存在那里。

我看到两个问题:

  1. 看起来您实际上并没有回到您离开的“屏幕 B”。故事板显示了从 B 到 C 的推式转场,以及从 C 到 B 的另一个推式转场。所以我认为正在发生的事情是您正在创建 另一个 屏幕 B,与第一个屏幕分开。您应该查看unwinding the push segue 而不是添加另一个。请记住:您在情节提要中创建的屏幕不是单独的对象——它们更像是对象的模式或原型,并且可以多次实例化。

  2. 更一般地说,最好避免将程序的数据存储在视图甚至视图控制器中。 MVC 中的 M 代表 model,它是一个单独的对象(或一组对象),用于管理应用程序的数据和业务逻辑。使用模型不能解决问题 #1,但它仍然可以帮助您避免很多“嘿,我的数据去哪儿了?”问题。

【讨论】:

  • 假设屏幕 B 中的某个人输入了他们的名字,然后有一个算法可以根据他们的名字计算出他们最喜欢的足球队。你是说算法不应该在视图控制器代码中?
  • 是的。将您的示例扩展为非平凡的东西,并且很快您将希望拥有多个都可以访问应用程序数据的视图控制器。如果您将业务逻辑和数据保存在视图控制器中,则它仅在该控制器中可用。
  • 那么你会把它放在一个 swift 文件中而不是一个可可豆荚文件中吗?该文件将如何访问用户键入的信息
  • Cocoapods 是一个依赖管理器,所以我认为这不是你真正的意思。查看 Apple 文档中的 Model-View-Controller
【解决方案2】:

这是一个常见问题。
当你实例化它时,你需要将数据传递到每个新的 VC 中。您要保存的数据可以是每个VC中的实例变量。

或者您需要将要持久化的数据保存到NSUserDefaults 或使用Core Data。如果你走这条路,一旦你将数据保存到这些地方之一,你就可以随时随地访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多