【问题标题】:How do I save a var when my iOS app closes? [duplicate]我的 iOS 应用程序关闭时如何保存 var? [复制]
【发布时间】:2016-12-19 16:30:24
【问题描述】:

我总共有 2 个视图控制器。该应用程序与此人在教程中制作的相同。 https://www.youtube.com/watch?v=LrCqXmHenJY&t=40s

首先,我创建了一个 var:

import UIKit

var list = ["Task 1", "Task 2", "Task 3", "Task 4"]

class FirstViewController: UIViewController , UITableViewDelegate, UITableViewDataSource{

我目前的问题是,当我关闭应用程序时,我创建的 ToDo 没有被保存。 我需要做什么来保存我的 var 列表,以便下次打开时我的 ToDo-List 不为空?

【问题讨论】:

  • 没有理由在类范围之外有这样的变量。将变量嵌入到相关类中。
  • 如果你想实现一个适当的持久存储(或者例如 SQLite、Realm 是替代品),请查看 Core Data,或者如果你想从简单的开始使用NSUserDefaults
  • @xoudini 不建议使用 UserDefaults 来保存数据。这不是它的用途。
  • 仅供参考 - 在查看重复的问题及其答案时,请忽略告诉您使用 UserDefaults 的答案。这对于简单的标志和个人偏好值等来说很好。但这并不意味着存储用户数据。查看建议正确替代 UserDefaults 的答案。
  • @rmaddy 同意,这就是为什么我的第一个建议是实际数据库。请注意,我建议 “从简单的事情开始” 的默认值 - 只是因为 OP 似乎刚刚开始进行 iOS 开发。直接跳入数据库迁移等对于初学者来说可能有点令人沮丧。

标签: ios swift


【解决方案1】:

您可以使用UserDefaults 来保存/加载应用程序状态或配置。对于复杂的需求,请使用CoreData

应用终止前写入/保存

let defaults = UserDefaults.standard
defaults.set(true, forKey: "Enabled")

在应用启动时读取/加载

let defaults = UserDefaults.standard
let enabled = defaults.bool(forKey: "Enabled")

阅读相关的 Apple 文档here

【讨论】:

  • Zee 的回答是最完整的。他甚至给了你示例 Swift 3 代码。我建议接受他的回答。 (已投票)
  • @DuncanC 不。这个答案不合适。不要使用UserDefaults 来存储数据。那不是它的目的。其次,不要在UserDefaults上不必要地拨打synchronize
  • 您应该调用synchronize 的唯一位置是在applicationDidEnterBackground UIApplicationDelegate 方法中。
【解决方案2】:

如果您想要一种简单的方法来存储字符串列表,您可以使用UserDefaults。另一种方法是使用更难使用的 Core Data。它通常用于存储比字符串数组更复杂的数据结构。

要将字符串数组保存到UserDefaults,请执行以下操作:

UserDefaults.standard.set(list, "myStringArray")

你可以用你想要的任何键替换"myStringArray"

要检索它,请执行以下操作:

list = UserDefaults.standard.stringArray(forKey: "myStringArray")

我建议你在App Delegate的这个方法中保存数组:

func applicationDidEnterBackground(_ application: UIApplication) {

}

有关用户默认设置的更多信息,请参阅https://developer.apple.com/reference/foundation/userdefaults

【讨论】:

  • 我不同意您的“...要正确存储它,您应该使用 Core Data...”评论。 UserDefaults 可以很好地保存简单数据,并且可以完美地满足 OP 的需求。 Core Data 对于一个简单的字符串数组来说太过分了,而且它的学习曲线非常陡峭。 Core Data 不是适合初学者的框架。
  • @DuncanC 如果你这么说,我会删除它。
  • 为什么每个人都错误地建议使用 UserDefaults 来存储用户数据。那不是它的目的。将数据写入文件(plist)或使用数据库。不要对数据使用 UserDefaults。
【解决方案3】:

你有非常简单的需求。查看NSUserDefaults(现在在 Swift 3 中称为 UserDefaults。)

当数据发生变化时将数据保存到 UserDefaults,并在显示视图控制器时将其读回。

正如 Eric 在他的 cmets 中所说,将列表设为视图控制器的实例变量。

编辑:

在下面的 cmets 中,rmaddy 指出该应用程序将保存一个待办事项列表。这可能会变得复杂,从由少数项目组成的数组增加到更大的数组或可能更复杂的结构。

鉴于此,您可能希望将数据保存到文档目录中的 plist 文件(非常简单),或者如果您有自定义对象而不是可以保存的“属性列表”类型的小列表,则使用 NSCoding到 plist。

这两种解决方案都同时读取数据并将数据写入文件。对于待办事项列表应用来说,这可能没问题。

如果您需要更改较大数据集的部分内容并保持其余部分不变,那么是时候考虑使用像 Core Data 这样的数据库了。

【讨论】:

  • 不,不要使用 UserDefaults 来存储数据。有适当的解决方案来存储数据。
  • @rmaddy,我不同意你的看法。对于存储少量简单数据UserDefaults 非常适合。同意仅从 applicationDidEnterBackground 通知方法调用同步,但除此之外,它是这个简单用例的一个很好的解决方案。您会推荐什么作为存储此类简单数据的替代方法?
  • 这个问题的数据似乎很简单,因为它似乎只是一个只有几个条目的简单字符串数组。但是一个真正的 TODO 应用程序最终会得到比简单的字符串数组更多的数据。随着应用程序数据的大小和复杂性的增加,现在建议使用 UserDefaults 只会导致 OP 走上错误的道路。顺便说一句 - 不是我的反对票。
  • 好的,重点。我只是看了一眼问题中显示的数据,并错过了关于“To Dos”的部分。对于非常复杂的数据,用户默认值不是一个好的选择。
猜你喜欢
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多