IOS 编辑器错误。 archivedData 重命名

标签 ios swift nskeyedarchiver

请帮帮我!我陷入了一个循环,找不到出路。我正在尝试为工作学习 IOS 编程,所以我想我会从他们的教程应用程序 Meal list 应用程序开始。我在你应该开始保存持久数据的部分,现在编辑器让我陷入了一个永无止境的循环。我有一行代码...

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

这给了我一个警告说...

'archiveRootObject(_:toFile:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead

好的,所以我将代码行更改为...

let isSuccessfulSave = NSKeyedArchiver.archivedDataWithRootObject(meals)

然后给了我警告...

'archivedDataWithRootObject' has been renamed to 'archivedData(withRootObject:)'

好的,所以我将代码行更改为...

let isSuccessfulSave = NSKeyedArchiver.archivedData(withRootObject: meals)

这告诉我...

'archivedData(withRootObject:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead

好的... 所以... archivedData 已被弃用,我必须使用 archivedDataWithRootObject,但使用 archivedDataWithRootObject 已重命名为 archivedData,但 archivedData 已被弃用,因此请使用 archivedDataWithRootObject,它被重命名为 archivedData,它已被弃用...无穷无尽.

我曾尝试查看开发人员文档,但他们只是告诉我同样的事情,其中​​一个已被弃用,没有任何链接或任何内容,搜索 google 只给我一堆页面,向我展示了使用其中任何一个的语法。我仍然是 IOS 编程的新手,不知道如何摆脱 deprecated to renamed to deprecated to ... 的无休止循环。

请帮忙,我迷路了,不知道如何继续。谢谢。

最佳答案

我正在关注 the same example you are trying to do ,并且我想出了如何更新在 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 beta,而 iOS 13 应该适用于这些版本之前的任何版本。

关于IOS 编辑器错误。 archivedData 重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53347426/

相关文章:

iphone - uitableview 的最后一行中的值发生变化

iphone - 单例不会从应用程序委托(delegate)持久化到另一个 View Controller 中

ios - Swift 无法取消归档数据

ios - Swift:从照片库中获取资源,排除子类型

ios - 如何将一个导航 Controller 导航到另一个 iOS 导航 Controller

ios - iOS-编码/解码枚举-重新启动后在访问时崩溃

iphone - 应用程序只对肖像启用,但 UIImagePickerController 在 iOS6 中旋转

一次推送显示两次 iOS 推送通知横幅

ios - UIScrollView: addSubview 不添加项目

ios - UIButton 突出显示的背景图像未显示