macOS/Swift: сохранение табличного представления после изменения его порядка
После решения здесь я смог изменить порядок строк NSTableView
, но приложение не сохраняет / загружает табличное представление с новым порядком строк после выхода.
Контроллер вида:
import Cocoa
@objcMembers class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
@IBOutlet weak var tableView: NSTableView!
var persons = [Person]()
override func viewDidLoad() {
super.viewDidLoad()
persons = Person.loadFromFile()!
tableView.delegate = self
tableView.dataSource = self
tableView.registerForDraggedTypes([.string])
}
override func viewDidDisappear() {
Person.saveToFile(persons: persons)
}
func numberOfRows(in tableView: NSTableView) -> Int {
return persons.count
}
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
return persons[row]
}
func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool {
let data = NSKeyedArchiver.archivedData(withRootObject: rowIndexes)
pboard.declareTypes([.string], owner: self)
pboard.setData(data, forType: .string)
return true
}
func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
if dropOperation == .above {
return .move
} else {
return []
}
}
func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
let pasteboard = info.draggingPasteboard()
let pasteboardData = pasteboard.data(forType: .string)
if let pasteboardData = pasteboardData {
if let rowIndexes = NSKeyedUnarchiver.unarchiveObject(with: pasteboardData) as? IndexSet {
var oldIndexOffset = 0
var newIndexOffset = 0
for oldIndex in rowIndexes {
if oldIndex < row {
// Dont' forget to update model
tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1)
oldIndexOffset -= 1
} else {
// Dont' forget to update model
tableView.moveRow(at: oldIndex, to: row + newIndexOffset)
newIndexOffset += 1
}
}
}
}
return true
}
Модель:
import Cocoa
@objcMembers class Person: NSObject, Codable {
[...]
static let DocumentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("persons").appendingPathExtension("plist")
[...]
static func loadFromFile() -> [Person]? {
guard let codedPersons = try? Data(contentsOf: ArchiveURL) else {return nil}
let decoder = PropertyListDecoder()
return try? decoder.decode(Array<Person>.self, from: codedPersons)
}
static func saveToFile(Persons: [Person]) {
let encoder = PropertyListEncoder()
let codedPersons = try? encoder.encode(persons)
try? codedPersons?.write(to: ArchiveURL)
}
}
Должен ли я изменить persons
где // Dont' forget to update model
комментарии есть?
РЕДАКТИРОВАТЬ: я смог сохранить / загрузить переупорядочение таблицы, удалив и вставив элемент в persons
в каждом из // Dont' forget to update model
прицелы.
Спасибо.