永久数据和准备争夺

6 arrays xcode segue swift

我正在尝试使用永久数据和一起准备争夺.这就是我目前所做的:(查看控制器1)

override func viewDidAppear(_ animated: Bool) {

    let itemsObject = UserDefaults.standard.object(forKey: "items")


    if let tempItems = itemsObject as? [String] {

        items = tempItems

}
Run Code Online (Sandbox Code Playgroud)

在(视图控制器2)中:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toSecondViewController" {

        let itemsObject = UserDefaults.standard.object(forKey: "items")

        var items:[String]

        if let tempItems = itemsObject as? [String] {

            items = tempItems

            items.append(textField.text!)

            print(items)

        } else {

            items = [textField.text!]

        }

        UserDefaults.standard.set(items, forKey: "items")


    }
}
Run Code Online (Sandbox Code Playgroud)

我试图在VC2上的数组中添加一个项目.然后我想将数组传输到VC1,同时也永久存储它.然后每次我关闭并重新加载应用程序时,我都可以打印数组.错误消息指出"使用未解析的标识符项".我正在使用Xcode 8.0和Swift 3.0.

在此输入图像描述

在此输入图像描述

Phi*_*tto 1

好的,因为您说您想在应用程序启动时保留数据,所以您将需要用户默认值来存储您的项目。正如丹已经建议的那样,你基本上做得对。您只想设置一个之前未声明的变量。但我将在下面的代码中向您展示这一点。我还将附加第二种方法,其中在执行转场时将项目传递到下一个视图控制器。

\n\n

第一个例子:假设我们有两个视图控制器,就像你的例子一样。第一个视图控制器包含一个 UITextField 来执行用户文本输入。每当我们借助故事板转场(例如按下按钮时)从第一个视图控制器切换到第二个视图控制器时,我们都会从用户默认值中获取先前转场中的现有文本,并添加当前用户输入,然后将其保留回来到用户默认值。这发生在第一个视图控制器中:

\n\n
class ViewController: UIViewController {\n\n@IBOutlet weak var textField: UITextField!\n\noverride func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n    super.prepare(for: segue, sender: sender)\n\n    if segue.identifier == "toSecondViewController" {\n        let itemsFromDefaults = UserDefaults.standard.object(forKey: "items")\n\n        var items: [String]\n\n        if let tempItems = itemsFromDefaults as? [String]\n        {\n            items = tempItems\n            items.append(textField.text!)\n        }\n        else\n        {\n            items = [textField.text!]\n        }\n\n        print(items)\n\n        UserDefaults.standard.set(items, forKey: "items")\n    }\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第一个视图控制器看起来与您的代码非常相似,但我想添加它以保持完整性。

\n\n

然后在第二个视图控制器中,我们只需从用户默认值中获取项目并将其直接存储在该视图控制器的实例变量中。借助此功能,我们可以在视图控制器中的其他方法中执行我们想要的操作并进一步处理项目。正如我所说,您缺少的是用于存储项目的实例变量声明。

\n\n
class ViewController2: UIViewController {\n\nprivate var items: [String]? // This is only accessible privately\n\noverride func viewDidAppear(_ animated: Bool) {\n    super.viewDidAppear(animated)\n\n    self.items = UserDefaults.standard.object(forKey: "items") as? [String]\n}\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二个示例:您还可以在 ViewController2 中声明一个内部/公共变量,以便您可以直接从执行 segue 中的第一个视图控制器设置它。您\xc2\xb4t 不需要从ViewController2 中的用户默认值中获取项目。为此,您可以访问 segue 的目标视图控制器,然后将其转换为 ViewController2 并直接设置它的项目。

\n\n
class ViewController: UIViewController {\n\n@IBOutlet weak var textField: UITextField!\n\noverride func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n    super.prepare(for: segue, sender: sender)\n\n    if segue.identifier == "toSecondViewController" {\n\n        let itemsFromDefaults = UserDefaults.standard.object(forKey: "items")\n\n        var items: [String]\n\n        // [...] Do the stuff to get the items and add current input like before [...]\n\n        let destinationViewController = segue.destination as! ViewController2\n\n        destinationViewController.items = items\n    }\n}\n}\n\nclass ViewController2: UIViewController {\n\nvar items: [String]? // This is accessible from outside now\n\noverride func viewDidAppear(_ animated: Bool) {\n    super.viewDidAppear(animated)\n\n    print(items) // We can now print this because it is set in prepareForSegue\n}\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我真的希望我能帮助你,并解释得通俗易懂。如果您有任何疑问,请随时发表评论。

\n