Xcode: Swift - 如何保存拖放表格视图单元格位置(核心数据)?
Xcode: Swift - How to save drag and drop tableview cell positions (core data)?
我对 swift 开发还很陌生。在拖放单元格后,我需要一些帮助保存单元格的位置。问题是我可以毫无问题地拖放单元格。然而,当我导航到其他视图控制器或当我关闭并打开模拟器时,单元格重置到旧位置。
我按照另一个 Whosebug 的答案来做这个但是我找不到任何与我的答案相关的 question.I 已经发布了我用来执行拖放功能的代码。感谢您的帮助,谢谢。
var notes = [Notes]()
var managedObjectContext: NSManagedObjectContext!
@IBOutlet weak var tableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
tableview.dragDelegate = self
tableview.dropDelegate = self
tableview.dragInteractionEnabled = true
}
override func viewWillAppear(_ animated: Bool) {
self.tableview.reloadData()
loadData()
}
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let dragItem = UIDragItem(itemProvider: NSItemProvider())
dragItem.localObject = notes[indexPath.row]
return [ dragItem ]
}
func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
}
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let mover = notes.remove(at: sourceIndexPath.row)
notes.insert(mover, at: destinationIndexPath.row)
tableview.reloadData()
}
更新 1:我试过了,但没用
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath:
IndexPath, to destinationIndexPath: IndexPath) {
let mover = notes.remove(at: sourceIndexPath.row)
notes.insert(mover, at: destinationIndexPath.row)
do{
try notes.managedObjectContext.save()
} catch {
print("Rows could not be saved")
}
我看到有一个 loadData()
方法,但看不到它的实际作用。
我想如果 loadData()
方法从 Core Data 加载数据并存储到 notes
数组?如果是这样,那么它应该是问题所在。由于您修改了 notes
(通过调用 notes.remove()
和 notes.insert()
),但是您还没有将 notes
保存到 Core Data,所以在 loadData()
之后 [=18] =] 被调用时,您再次将核心数据中的原始数据加载到 notes
。
要修复它,您应该在 notes.insert()
之后将 notes
保存到 Core Data。
我对 swift 开发还很陌生。在拖放单元格后,我需要一些帮助保存单元格的位置。问题是我可以毫无问题地拖放单元格。然而,当我导航到其他视图控制器或当我关闭并打开模拟器时,单元格重置到旧位置。
我按照另一个 Whosebug 的答案来做这个但是我找不到任何与我的答案相关的 question.I 已经发布了我用来执行拖放功能的代码。感谢您的帮助,谢谢。
var notes = [Notes]()
var managedObjectContext: NSManagedObjectContext!
@IBOutlet weak var tableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
tableview.dragDelegate = self
tableview.dropDelegate = self
tableview.dragInteractionEnabled = true
}
override func viewWillAppear(_ animated: Bool) {
self.tableview.reloadData()
loadData()
}
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let dragItem = UIDragItem(itemProvider: NSItemProvider())
dragItem.localObject = notes[indexPath.row]
return [ dragItem ]
}
func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
}
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let mover = notes.remove(at: sourceIndexPath.row)
notes.insert(mover, at: destinationIndexPath.row)
tableview.reloadData()
}
更新 1:我试过了,但没用
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath:
IndexPath, to destinationIndexPath: IndexPath) {
let mover = notes.remove(at: sourceIndexPath.row)
notes.insert(mover, at: destinationIndexPath.row)
do{
try notes.managedObjectContext.save()
} catch {
print("Rows could not be saved")
}
我看到有一个 loadData()
方法,但看不到它的实际作用。
我想如果 loadData()
方法从 Core Data 加载数据并存储到 notes
数组?如果是这样,那么它应该是问题所在。由于您修改了 notes
(通过调用 notes.remove()
和 notes.insert()
),但是您还没有将 notes
保存到 Core Data,所以在 loadData()
之后 [=18] =] 被调用时,您再次将核心数据中的原始数据加载到 notes
。
要修复它,您应该在 notes.insert()
之后将 notes
保存到 Core Data。