Попытка отредактировать список в области - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь создать 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 Ответ

0 голосов
/ 27 декабря 2018

Вы не можете напрямую изменить экземпляр Results.Results - это автоматически обновляемые коллекции, что означает, что они всегда отражают текущее состояние запроса, который вы использовали для их инициализации.Вам необходимо изменить Realm, чтобы изменить экземпляр Results.

Более того, экземпляр Results гарантированно сохранит свой порядок только в случае, если вы его отсортируете.Поэтому вам нужно будет ввести свойство в Trip, которое вы используете для сортировки объектов и изменить это свойство, когда пользователь перемещает строку.

Ваш класс TripsList кажется ненужным, так как кажется,что вы просто хотите хранить несколько Trip объектов в Realm, а затем извлекать их, фактически не делая никакой группировки.Даже если вам нужно сгруппировать их, вы можете сделать это, используя запросы Realm.Учитывая это, я бы изменил ваш текущий код, чтобы позволить пользователю сортировать свои Trip s и сохранять сортировку в 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
    }
}
...