Это не проблема, связанная с 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()
}
}