【问题标题】:Save an Object into User Defaults [duplicate]将对象保存到用户默认值中[重复]
【发布时间】:2019-07-25 11:04:17
【问题描述】:

我无法在我的用户默认设置中保存 viewControllers 列表,它在 userDefault.set(vcList, forKey: "vcList") 处崩溃。

错误日志说:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试插入非属性列表对象

import UIKit

class ViewController: UIViewController {

    struct viewControllerList {
        var vc1 = ViewController()
        var vc2 = LoginViewController()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let vcList = viewControllerList()
        let userDefault = UserDefaults.standard
        userDefault.set(vcList, forKey: "vcList")
    }
}

请帮忙!

【问题讨论】:

  • 两种情况不同
  • 如果你试图保存viewController的状态来恢复app状态,那么你做错了

标签: ios swift nsuserdefaults


【解决方案1】:

UserDefaults 类提供方便的方法来访问常见类型,例如 floats, doubles, integers, Boolean values, and URLs

default 对象必须是一个属性列表,即 NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary 的实例(或者对于集合,是实例的组合)。如果要存储任何其他类型的对象,通常应该将其归档以创建 NSData 的实例。

【讨论】:

    【解决方案2】:

    你可以试试这个

    //MARK:- Save viewController in UserDefault
        func saveInDefaults(_ viewController : UIViewController) -> Void{
            do {
                let encodeData  = try NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false)
                UserDefaults.standard.set(encodeData, forKey: "vcList")
                UserDefaults.standard.synchronize()
            } catch {
                print("error")
            }
        }
    

    viewDidLoad调用函数

    override func viewDidLoad() {
            super.viewDidLoad()
            let vcList = viewControllerList()
            self.saveInDefaults(vcList)
        }
    

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多