Как я могу сохранить состояние UISwitches на TableViewController при навигации по различным контроллерам представления / контроллерам представления таблицы? - PullRequest
0 голосов
/ 23 февраля 2020

Приложение «Мой контрольный список» имеет различные разделы, где находится главный экран (UIViewController) с несколькими кнопками, ведущими к различным продуктам питания (овощи, фрукты и т. Д. c.). Кнопки ведут на страницу TableViewController, где вы можете добавлять элементы с помощью кнопки «+», которая модально представляет контроллер представления «Добавить элемент».

После добавления элементов в список он помещает имя элемента и UISwitch в крайнем правом положении. Этот переключатель представляет контрольную часть контрольного списка. Тем не менее, независимо от того, в каком состоянии вы его оставите, при переходе между различными подразделами (например, переходя из Списка овощей -> Домой -> Список фруктов -> Домой -> Вернуться к списку овощей) и возвращаясь к исходному списку, все выключатели выключены.

У меня есть представление о том, что я должен делать: UserDefaults. Моя идея состоит в том, чтобы сохранить состояние переключателя при его изменении, а затем в функции viewDidLoad выполнить итерацию всех видимых элементов и установить состояние переключателей в их сохраненные состояния. Однако я не уверен, с чего начать эту идею.

Снимок части моей раскадровки, на которой изображен дизайн области моего списка и области добавленных элементов

Список TableViewController связан с классом с именем MEListViewController. Проблема здесь в том, что когда я пытаюсь создать розетку в классе ViewController, он говорит, что

Мне не разрешено устанавливать розетки на повторяющиеся объекты.

Итак, Как я могу сохранить состояние коммутаторов и сохранить их в выбранном пользователем состоянии, даже если вы перемещаетесь по разным экранам?

В настоящее время переключатели можно переключать при просмотре списка. Покиньте список и вернитесь к нему, и переключатели вернутся в состояние «ВЫКЛ» по умолчанию.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Для решения этой проблемы

"написано, что я не могу ставить розетки на повторяющиеся объекты."

Вам нужен пользовательский UITableViewCell class и затем вы можете иметь UISwitch розетку там.

Затем, чтобы сохранить состояние UISwitch для дальнейшего использования

Вы можете сохранить только выбранный индекс ячейки как состояние в UserDefault и проверка того же с текущим индексом в cellForRowAt метод tableView. Если он найден, то ваше последнее состояние - ON, в противном случае по умолчанию OFF.

Этот фрагмент кода будет работать так, как вы ожидаете:

Пользовательский UITableViewCell класс

class CustomCell: UITableViewCell {

  @IBOutlet weak var switchObj: UISwitch!
  @IBOutlet weak var textValue: UILabel!

  @IBAction func toggleState(_ sender: Any) {
    var loadValues: [Int: Bool]!
    if let values = Memory.getStatesFromMemory() {
      loadValues = values
    } else {
      loadValues = [Int: Bool]()
    }
    loadValues[switchObj.tag] = switchObj.isOn
    Memory.saveSwitchStatesToMemory(savedStates: loadValues)
  }
}

UIViewController класс

class CustomTableView: UIViewController, UITableViewDelegate, UITableViewDataSource {

  var savedStates: [Int: Bool]!

  override func viewDidLoad(){
    super.viewDidLoad()
    if let values = Memory.getStatesFromMemory() {
      savedStates = values
    } else {
      savedStates = [Int: Bool]()
    }
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell") as? CustomCell
    cell?.switchObj.isOn = savedStates[indexPath.row] == nil ? false : savedStates[indexPath.row]!
    cell?.switchObj.tag = indexPath.row
    cell?.textValue.text = "Switch stored state >>"
    return cell!
  }

  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     return 80
  }
}

Пользовательский класс для использования / сохранения значений из памяти

class Memory {

  static func getStatesFromMemory() -> [Int: Bool]? {
    if let switchValues = UserDefaults.standard.object(forKey: "SwitchStates") as? Data {
      let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: switchValues) as! [Int: Bool]
      return decodedTeams
    }
    return nil
  }

  static func saveSwitchStatesToMemory(savedStates: [Int: Bool]) {
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: savedStates)
    let userDefaults = UserDefaults.standard
    userDefaults.set(encodedData, forKey: "SwitchStates")
    UserDefaults.standard.synchronize()
  }
}
0 голосов
/ 23 февраля 2020

Для простой реализации у вас может быть массив Item объектов (ниже). Когда вы переключаете переключатель, выясните, какая ячейка была переключена, а затем обновите состояние isOn в соответствующем Item.

Когда вы удаляете ячейку из очереди перед ее отображением, обязательно обновите * 1006. * состояние, основанное на значении соответствующего Item.

Вот базовый c класс предметов, который может помочь вам начать.

class Item {
    var isOn: Bool
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...