Лучший способ редактировать отфильтрованный массив после поиска с помощью UISearchController - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время у меня есть UITableViewController с массивом Memories (который представляет собой структуру с двумя переменными - memoryTitle и memoryDescription).Среди didSelectRowAt, я запустил следующую функцию, чтобы позволить пользователю редактировать элемент.

func configure(memory: Memory, position: Int) {
    guard let vc = storyboard?.instantiateViewController(withIdentifier: "AddMemoryViewController") as? AddMemoryViewController else {
        fatalError("Unable to create AddMemoryViewController")
    }

selectedMemory = position
vc.delegate = self
vc.memory = memory
navigationController?.pushViewController(vc, animated: true)

}

Как только они закончили редактирование, мой AddMemoryViewController отправляет данные обратноделегату (который является моим исходным представлением таблицы) и обновляет память следующим кодом:

  func update(memory: Memory) {
        guard let selectedMemory = selectedMemory else { return }

        memories[selectedMemory] = memory
        saveData()
        tableView.reloadData()
    }

Это работает нормально, но сейчас я пытаюсь реализовать UISearchController в моем исходном представлении таблицы,Текущий способ, которым я пытаюсь использовать, это наличие массива FilterMemories.Если я использую FilterMemories и попытаюсь отредактировать один из этих элементов, я не уверен, как снова обновить исходный элемент (так как индекс элемента различен для каждого массива).Я думаю, что ответ лежит где-то в замене Memories на класс (поэтому отфильтрованные памяти и памяти редактируют один и тот же объект), но было бы здорово, если бы кто-нибудь мог дать какое-то руководство, как решить эту проблему, пожалуйста?

Многиезаранее спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Чтобы использовать IndexSet, вы можете сделать следующее.Учитывая следующие данные:

var dataArray = ["A1", "B1", "A2", "C1", "C2", "A3"]
//                0     1     2     3     4     5

// filter for "A*", here hard coded, in real live you would
// calculate it dynamically:
var index : IndexSet = [0,2,5] // Index of "A*" in dataArray

// Example: get data for row == 2
var dataIndex = index[2] // 5
var data = dataArray[dataIndex] // "A3"

Итак:

  • При фильтрации сохраняйте соответствующие индексы исходного массива в IndexSet

  • numberOfRows вернет счетчик набора индексов

  • cellForRow извлечет исходный индекс из набора индексов, получит соответствующую запись из исходного массива и настроитячейка
    • Итак, для row==2, получите dataArray[index[2]]
  • Обновление сделает то же самое: получите индекс, затем получите данные
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...