gpt4 book ai didi

ios - 在 TableView 中对行重新排序后将对象保存在 UserDefaults 中

转载 作者:行者123 更新时间:2023-11-28 11:55:56 32 4
gpt4 key购买 nike

我已经搜索了几天关于如何在使用 Swift 对 TableView 重新排序后保存对象的问题的答案?我在 Internet 上发现许多教程都介绍了如何重新排序以及如何使用数组保存它。

无论我尝试什么,我都出不来。我从实体中提取数据。但是当我尝试在 userdefaults 中保存排序时,出现以下错误:

[User Defaults] Attempt to set a non-property-list object

我不明白为什么我没有存储再订购。

这是我现在的代码。我做错了什么?
请你能帮我解决这个问题吗?非常感谢。


import UIKit
import CoreData

class hondenTableViewController: UITableViewController {

var honden = [Hond]() // legen array aanmaken
var dateFormatter = DateFormatter()

let store = UserDefaults(suiteName: "MultiSelectTable")
var opgeslagenHonden = [String]()

override func viewDidLoad() {
super.viewDidLoad()

if let defaults = self.store?.array(forKey: "hondjes") {
self. opgeslagenHonden = defaults
}


self.navigationItem.leftBarButtonItem = self.editButtonItem

// Nederlands opgebouwde datum op geven
dateFormatter.dateFormat = "E d MMM y"
self.tableView.reloadData()
}

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

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

let fetchReqeust = Hond.fetchRequest() as NSFetchRequest
do {
honden = try context.fetch(fetchReqeust)
} catch let error {
print("Ophalen mislukt door error\(error)")
}

tableView.reloadData()

}
// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return honden.count

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "hondenCellIdentifier", for: indexPath)
let hond = honden[indexPath.row]

cell.textLabel?.text = hond.naam

if let date = hond.geboortedatum as Date? {
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"

cell.detailTextLabel?.text = "Geboren op : " + dateFormatter.string(from: date) + " = " + helper.berekenLeeftijd(formatter.string(from: date) + " oud.")

} else {
cell.detailTextLabel?.text = "Geboortedatum onbekend."
}

return cell
}

// Override to support conditional editing of the table view.
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}

// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

if honden.count > indexPath.row {

let hond = honden[indexPath.row]

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

context.delete(hond)
honden.remove(at: indexPath.row)

do {
try context.save()
} catch let error {
print("Kan niet verwijderen door: \(error).")
}

tableView.deleteRows(at: [indexPath], with: .fade)
}
}

// Override to support rearranging the table view.
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let movedObject = self.honden[sourceIndexPath.row]
honden.remove(at: sourceIndexPath.row)
honden.insert(movedObject, at: destinationIndexPath.row)

let defaults = UserDefaults.standard
defaults.set(honden, forKey: "hondjes")
defaults.synchronize()
//NSLog("%@", "\(sourceIndexPath.row) => \(destinationIndexPath.row) \(honden)")
}

// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable.
return true
}

}

我很乐意提供帮助:)

最佳答案

正如@donnywals 在他的回答中所说,您不能将自定义对象直接写入 UserDefaults。只有一小部分数据类型(我能记住的是DateArrayDictionaryIntFloat, Double, Data, String.) 调用的“属性列表对象”可以写入 UserDefaults,或属性列表文件。

在我看来您正在使用 Core Data,那么您为什么要尝试将对象数组写入 UserDefaults?这是对 UserDefaults 的误用,而这正是 CoreData 设计的目的,那么为什么不将您的数据保存到 Core Data 中呢?

关于ios - 在 TableView 中对行重新排序后将对象保存在 UserDefaults 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50977796/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com