Как сохранить состояние кнопки переключения внутри ячеек таблицы с помощью панели поиска в xcode - PullRequest
0 голосов
/ 04 марта 2020

Описание: у меня есть содержимое в виде таблицы вместе с кнопкой переключения.

Проблема: после использования панели поиска для поиска элементов в виде таблицы состояние кнопки переключателя потеряно - кнопка переключателя, которая была установлена ​​для строки 0 и строки 1, потерялась.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Это не проблема, связанная с UISearchBar, но, похоже, из-за перезагрузки TableView.

Чтобы сохранить состояние UISwitch в случае перезагрузки таблицы, вам нужен собственный класс UITableViewCell и 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 голосов
/ 04 марта 2020

Для этого вам нужно сохранить состояние кнопки вместе с вашими данными.

и прочитать данные в cellForRowAtIndexPath: UI

Пример:

 if indexPath.row == 0 || indexPath.row == 1{
    // Handle Button UI here
    let value = buttonArrayData[indexPath.row]
      if(value){
         //button selected
         //update buttonArrayData data accordingly.
      }
      else{
       //button unselected
       //update buttonArrayData data accordingly.   
         }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...