加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组 – 永久数据和准备争夺

发布时间:2020-12-14 19:41:25 所属栏目:百科 来源:网络整理
导读:我正在尝试一起使用永久数据和准备癫痫.这就是我目前所做的:(查看控制器1) override func viewDidAppear(_ animated: Bool) { let itemsObject = UserDefaults.standard.object(forKey: "items") if let tempItems = itemsObject as? [String] { items = tem
我正在尝试一起使用永久数据和准备癫痫.这就是我目前所做的:(查看控制器1)

override func viewDidAppear(_ animated: Bool) {

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


    if let tempItems = itemsObject as? [String] {

        items = tempItems

}

在(视图控制器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")


    }
}

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

enter image description here

enter image description here

解决方法

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

第一个例子:想象一下,我们在你的例子中有两个视图控制器.第一个视图控制器包含一个UITextField来执行用户文本输入.每当我们在故事板segue的帮助下从第一个视图控制器切换到第二个视图控制器时(例如,当按下按钮时),我们从用户默认值中获取先前segue中的现有文本并添加当前用户输入然后再保留到用户默认值.这发生在第一个视图控制器中:

class ViewController: UIViewController {

@IBOutlet weak var textField: UITextField!

override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
    super.prepare(for: segue,sender: sender)

    if segue.identifier == "toSecondViewController" {
        let itemsFromDefaults = UserDefaults.standard.object(forKey: "items")

        var items: [String]

        if let tempItems = itemsFromDefaults as? [String]
        {
            items = tempItems
            items.append(textField.text!)
        }
        else
        {
            items = [textField.text!]
        }

        print(items)

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

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

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

class ViewController2: UIViewController {

private var items: [String]? // This is only accessible privately

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.items = UserDefaults.standard.object(forKey: "items") as? [String]
}

}

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

class ViewController: UIViewController {

@IBOutlet weak var textField: UITextField!

override func prepare(for segue: UIStoryboardSegue,sender: sender)

    if segue.identifier == "toSecondViewController" {

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

        var items: [String]

        // [...] Do the stuff to get the items and add current input like before [...]

        let destinationViewController = segue.destination as! ViewController2

        destinationViewController.items = items
    }
}
}

class ViewController2: UIViewController {

var items: [String]? // This is accessible from outside now

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    print(items) // We can now print this because it is set in prepareForSegue
}

}

我真的希望我可以帮助你并解释它是可以理解的.如果您有任何疑问,请随时发表评论.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读