(Swift) Основные данные перемещают строки - недопустимая ошибка обновления - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь переместить строки, содержащие основные объекты данных, в мое табличное представление.Я получаю недопустимую ошибку обновления.

Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (2), должно быть равно количеству строк, содержащихся в этом разделе.до обновления (2), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 перемещено). '

Я не понимаю, почему я это понимаю.Я удаляю строку, которую хочу переместить в исходный индексный путь, затем вставляю ее в целевой индексный путь.

Вот мой код:

// Move fetchedResultsController objects
override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {

    let movedObject = self.fetchedResultsController.objectAtIndexPath(sourceIndexPath) as! NSManagedObject

    controller(self.fetchedResultsController, didChangeObject: movedObject, atIndexPath: sourceIndexPath, forChangeType: .Delete, newIndexPath: sourceIndexPath)

    controller(self.fetchedResultsController, didChangeObject: movedObject, atIndexPath: sourceIndexPath, forChangeType: .Insert, newIndexPath: destinationIndexPath)
}

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Приведенный ниже код является быстрым 4. В ситуации, когда у вас есть таблица с несколькими разделами, ваш moveRowAt отIndexPath: IndexPath к toIndexPath: функция IndexPath должна вычислить правильную строку для перемещения.Вы не можете просто использовать index path.row (from & to), так как они не учитывают другие разделы.Я использую следующий метод для получения правильных строк: -

    // Do not trigger delegate methods when changes are made to core data by the user
        fetchedResultsController.delegate = nil
        var fromIndex = fromIndexPath.row
        var toIndex = toIndexPath.row
        //      print ("from row ",fromIndexPath.row)
//work out correct row to remove at based on it's current row and section
        for sectionIndex in 0..<fromIndexPath.section
        {
            fromIndex += fetchedResultsController.sections![sectionIndex].numberOfObjects
        }
            //print ("fromIndex ",fromIndex)
// remove the row at it's old position
       toDoData.remove(at: fromIndex)
//work out the correct row to insert at based on which section it's going to & row in that section
        for sectionIndex in 0..<toIndexPath.section
        {
            toIndex += fetchedResultsController.sections![sectionIndex].numberOfObjects
            //print ("toIndex ",toIndex)
            if sectionIndex == fromIndexPath.section
            {
                toIndex -= 1 // Remember, controller still thinks this item is in the old section
                //print ("-= toIndex",toIndex)
            }
        }
// put the item back into he array at new position
         toDoData.insert(item, at: toIndex)

Примечание: toDoData - это мой массив записей из fetchedResultsController
Примечание: вам также нужно обновить раздел, если вы сохраняетезапишите это в основные данные и пропустите через массив, чтобы обновить ваш заказ.использовать: - fetchedResultsController.sections! [toIndexPath.section] .name

0 голосов
/ 23 мая 2018

Задача fetchedResultsController состоит в том, чтобы отслеживать изменения основных данных и сообщать вашему пользовательскому интерфейсу, что его необходимо обновить, чтобы соответствовать тому, что сейчас находится в основных данных.Вы не вызываете контроллер (didChangeObject: .. методы; fetchedResultsController вызывает их.

Вы должны просто обновить объект в core-data, ожидая, пока fetchedResultsController сообщит вашему viewController об обновлении.

Переместить это сложнее. TableView уже обновлен, и теперь вы хотите обновить данные ядра. Но когда вы обновите данные ядра, fetchedResultsController предложит вам выполнить перемещение - что вы уже сделали!вместо этого установите fetchedResultsController в значение nil, затем обновите данные ядра (это будет поле, в котором объекты хранятся в вашей выборке, может быть, свойство order или что-то в этом роде), а затем сбросьте делегат fetchedResultsController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...