Попытка отредактировать список в области
Я пытаюсь сделать List
с царством:
class TripsList : Object {
let trips = List<Trip>()
}
Затем внутри моего класса ViewController:
var trips : Results<TripsList>?
override func viewDidLoad() {
super.viewDidLoad()
trips = realm.objects(TripsList.self)
}
Когда кто-то перемещает UITableViewRow, я хочу обновить базу данных своей области.
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let movedObject = self.realm.objects(Trip.self)[sourceIndexPath.row]
trips.remove(at: sourceIndexPath.row)
trips.insert(movedObject, at: destinationIndexPath.row)
}
Вот мои методы источника данных TableView:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return realm.objects(Trip.self).count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.font = UIFont.systemFont(ofSize: 17)
cell.accessoryType = UITableViewCell.AccessoryType.disclosureIndicator
cell.textLabel?.text = nameData.names[realm.objects(Trip.self)[indexPath.row].tripID]
return cell
}
Проблема в том, что нет возможности сделать trips.remove(at:)
или же trips.insert(_:at:)
,
Моя общая цель - возможность вставлять и удалять, когда кто-то перемещает UITableViewRow, и обновлять мою базу данных областей.
1 ответ
Вы не можете напрямую изменить Results
пример. Results
являются автоматически обновляемыми коллекциями, то есть они всегда отражают текущее состояние запроса, который вы использовали для их инициализации. Вам нужно изменить Realm
для того, чтобы изменить Results
пример.
Кроме того, Results
экземпляр гарантированно сохранит свой порядок только в случае, если вы его отсортируете. Так что вам нужно ввести свойство на Trip
что вы используете для сортировки объектов и изменения этого свойства, когда пользователь перемещает строку.
Ваш TripsList
класс, кажется, не нужен, так как кажется, что вы просто хотите сохранить ряд Trip
объекты в Realm, затем извлекайте их, фактически не группируя. Даже если вам нужно сгруппировать их, вы можете сделать это, используя запросы Realm. Учитывая это, я бы изменил ваш текущий код, чтобы позволить пользователю сортировать Trip
и сохранить сортировку в Realm
,
class Trip: Object {
// Your existing code for Trip
...
// Sorting property
@objc dynamic var sortingIndex = 0
}
В вашем контроллере табличного представления:
var trips : Results<Trip>?
override func viewDidLoad() {
super.viewDidLoad()
trips = realm.objects(Trip.self).sorted(byKeyPath: "sortingIndex")
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return trips?.count ?? 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.font = UIFont.systemFont(ofSize: 17)
cell.accessoryType = UITableViewCell.AccessoryType.disclosureIndicator
if let tripID = trips?[indexPath.row].tripID {
cell.textLabel?.text = nameData.names[tripID]
}
return cell
}
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
guard let movedObject = trips?.[sourceIndexPath.row] else { return }
// Depending on your exact needs, you might want to update the `sortingIndex` property of your other rows as well, whose position in the table view was affected by the reordering
try! realm.write {
movedObject.sortingIndex = destinationIndexPath.row
}
}