Удаление элемента в tableView удаляет неправильный соответствующий файл из сохраненных значений (swift NSCoding) - PullRequest
0 голосов
/ 25 апреля 2018

Я использовал приведенный ниже код, чтобы удалить элемент из TableView и соответствующий файл из архива.Если я удаляю 4-й элемент TableView, он удаляет 4-й файл с сохраненными значениями.Поскольку TableView является динамическим (сортировка элементов или изменение количества отображаемых элементов), а архив стабилен, код удаляет неправильные файлы, поскольку 1-й элемент в представлении может быть 6-м в сохраненных файлах.Поэтому, когда представление перезагружается, элемент удаляется, но не тот, который я хотел.(Я использовал NSCoding для хранения значений).Каждый элемент имеет уникальный идентификатор, а каждый файл - уникальное имя (которое является идентификатором), но я могу получить только идентификатор действительно удаленного элемента, а не тот, который я удаляю пальцем.Не могли бы вы мне помочь?Спасибо.

self.tableOfExpences.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)

//REMOVING FROM THE STORED VALUES================         

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
 let paths:[String] = Bundle.paths(forResourcesOfType: "dat", inDirectory: documentsPath)
        if paths.count > 0 {
             do {
                try FileManager.default.removeItem(atPath: paths[indexPath.row])
                print("deleted File has been removed")
                } catch {
                print("an error during a removing")
                }
        }



    } else if editingStyle == .insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }    
}

Попытка решить возможную проблему синхронизации

Сначала я проверяю, что табличное представление знает, что оно показывает.И кажется, что массивы синхронизированы.В области отладки я прочитал:

первая ячейка является опциональной (" Chocolate ") и имеет опциональный идентификатор ( 6 )

вторая ячейка является опциональной (" телефон ") и имеет опциональный идентификатор ( 7 )

Выше указаны правильные значения.

Затем проведу пальцем, чтобы удалить вторую ячейку (телефон) с ID 7 , и он сообщит мне, что будут удалены совершенно другие расходы с другим идентификатором и другим путем.

Для вышеуказанной проблемы решение пришло с [indexPath.row-1] вместо [indexPath.row].

     if indexPath.row == 0 {

            self.tableOfExpences.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)

        } else {
        self.tableOfExpences.remove(at: indexPath.row-1)
        tableView.deleteRows(at: [indexPath], with: .fade)
        }

Приведенное выше решение сработало, но когда я удалил последний элемент, приложение упало.Поэтому после просмотра похожих вопросов было решено вернуться к [indexPath.row] вместо [indexPath.row-1] и просто изменить порядок строк, чтобы сначала удалить данные из файла

    try FileManager.default.removeItem(atPath: paths[indexPath.row])
* 1033.* а затем реализовать
   self.tableOfExpences.remove(at: indexPath.row) 

Я надеюсь, что вышеупомянутое поможет кому-то с подобными проблемами. Конечно, без свойства filePth и отладки синхронизации я все равно буду наблюдать за сбоем кода. Спасибо за отличноеПомогите.Это была чудесная неделя.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Вероятно, проблема вызвана тем, что ваши два массива вышли из синхронизации.

Когда вы получаете массив путей путем извлечения документов из каталога «Документы», у вас нет гарантии, что они будут возвращены в том же порядке, что и данные вашей таблицы.

Вместо этого вы можете добавить путь к модели расходов, которая была бы намного более надежной

0 голосов
/ 25 апреля 2018

Вам нужно отсортировать пути так же, как сортируются элементы в таблице.

Bundle.paths(forResourcesOfType: "dat", inDirectory: documentsPath).a.sorted { $0 < $1 } // your logic sorting
0 голосов
/ 25 апреля 2018

Измените модель расходов, чтобы иметь свойство пути. Когда вы создаете Расход и сохраняете его в файловой системе, сохраняйте путь к нему и используйте его позже, когда хотите удалить расход

struct Expense {
    let filePath: String
    // .... other properties
}

Тогда вы можете просто позвонить:

try FileManager.default.removeItem(atPath: expenses[indexPath.row].filePath)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...