Попытка отредактировать список в области

Я пытаюсь сделать 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
    }
}
Другие вопросы по тегам