IOS编辑器错误.archivedData已重命名



请帮帮我!我陷入了困境,找不到出路。我正在努力学习IOS编程,所以我想我应该从他们的教程应用程序"餐单"应用程序开始。我正处于应该开始保存持久数据的部分,现在编辑器让我陷入了一个永无止境的循环。我有一行代码。。。

let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path)

这给了我一个警告,说。。。

"archiveRootObject(_:toFile:("在iOS 12.0中已弃用:使用+archivedDataWithRootObject:需要安全编码:错误:改为

好的,所以我把代码行改为…

let isSuccessfulSave = NSKeyedArchiver.archivedDataWithRootObject(meals)

这就给了我警告。。。

"archivedDataWithRootObject"已重命名为'存档数据(带RootObject:('

好的,所以我把代码行改为…

let isSuccessfulSave = NSKeyedArchiver.archivedData(withRootObject: meals)

告诉我…

"archivedData(withRootObject:("在iOS 12.0中已弃用:使用+archivedDataWithRootObject:需要安全编码:错误:改为

确定。。。所以…archivedData被否决了,我必须使用archivedDataWithRootObject,但使用archivedDataWithRootObject已被重命名为archivedData,但archivedData已被否决,所以使用被重命名为不推荐的archivedData的archivedDataWithRootObject。。。无限期。

我试过查看开发人员文档,但他们只是告诉我同样的事情,其中一个是不推荐的,没有链接或任何东西,搜索谷歌只会给我一堆页面,向我展示使用其中任何一个的语法。我仍然是IOS编程的新手,不知道如何摆脱这种从弃用到重命名到弃用的无休止循环…

请帮帮我,我迷路了,不知道该怎么继续。非常感谢。

我正在遵循您尝试做的相同示例,并且我已经了解了如何在iOS 12中更新存储和检索值的方法,这应该会对您有所帮助:

//MARK: Private Methods
private func saveMeals() {
let fullPath = getDocumentsDirectory().appendingPathComponent("meals")
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: meals, requiringSecureCoding: false)
try data.write(to: fullPath)
os_log("Meals successfully saved.", log: OSLog.default, type: .debug)
} catch {
os_log("Failed to save meals...", log: OSLog.default, type: .error)
}
}
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
private func loadMeals() -> [Meal]? {
let fullPath = getDocumentsDirectory().appendingPathComponent("meals")
if let nsData = NSData(contentsOf: fullPath) {
do {
let data = Data(referencing:nsData)
if let loadedMeals = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? Array<Meal> {
return loadedMeals
}
} catch {
print("Couldn't read file.")
return nil
}
}
return nil
}

此外,你会发现你需要更新ViewDidLoad如下:

override func viewDidLoad() {
super.viewDidLoad()
// Use the edit button item provided by the table view controller.
navigationItem.leftBarButtonItem = editButtonItem
let savedMeals = loadMeals()
if savedMeals?.count ?? 0 > 0 {
meals = savedMeals ?? [Meal]()
} else {
loadSampleMeals()
}
}

我希望这能有所帮助,对我来说,这个应用程序现在正在工作,存储和检索数据。

仅供参考:这不适用于Xcode 11测试版,iOS 13应该适用于这些版本之前的任何版本。

iOS 12的通用解决方案是:

class SettingsArchiver {
static func setData(_ value: Any, key: String) {
let ud = UserDefaults.standard
let archivedPool = try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
ud.set(archivedPool, forKey: key)
}
static func getData<T>(key: String) -> T? {
let ud = UserDefaults.standard
if let val = ud.value(forKey: key) as? Data,
let obj = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(val) as? T {
return obj
}
return nil
}
}

您需要

try {
let data = try NSKeyedArchiver.archivedData(withRootObject:meals,requiringSecureCoding:true)
try data.write(to:fullPath)
}
catch {
print(error)
}

在文档中,它是IOS11+

我想说,直接解决您的问题的答案是使用Meal.swift数据模型中定义的ArchiveURL(想想MVC模式(,并在MealTableViewController.swift控制器中重新实现saveMeals()函数,使用推荐的archiveRootObject方法的替代品:

private func saveMeals(){
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: meals, requiringSecureCoding: true)
try data.write(to: Meal.ArchiveURL)
}
catch {
print("Couldn't save to file")
}
}

虽然这个答案有点晚了:-(我希望它能帮助任何可能遇到这个问题的人。

最新更新