ios - 字典类型中 UserDefaults 保存的数组消失
问题描述
UIPickerView 中作为字典类型 UserDefaults 保存在 EventViewController 中的数组在返回 ViewController 时消失。使用按钮的@IBAction 保存放在 UITextField 中的字符。我想保留保存的字符串。我不知道解决方案。Xcode 12.2
class EventViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
@IBOutlet weak var partsPickerView: UIPickerView!
@IBOutlet weak var partsLabel: UILabel!
@IBOutlet weak var menuPickerView: UIPickerView!
@IBOutlet weak var menuLabel: UILabel!
@IBOutlet weak var menuTextField: UITextField!
放一个字典类型数组
var menuDataList: [String: [String]] = [
"Leg": ["Squat","Leg press","Leg extension"],
"Back": ["Deadlift","Bent over row","Chinning"],
"Chest": ["Barbell bench press","Dumbbell bench press","Incline Dumbbell Bench Press"]
]
var partsDataList: [String] = [
"Leg","Back","Chest"
]
var selectedParts = ""
委托设置
override func viewDidLoad() {
super.viewDidLoad()
partsPickerView.delegate = self
partsPickerView.dataSource = self
menuPickerView.delegate = self
menuPickerView.dataSource = self
menuTextField.delegate = self
partsPickerView.tag = 1
menuPickerView.tag = 2
selectedParts = partsDataList[0]
}
实例化 UserDefaults
let userDefaults = UserDefaults.standard
let keyMenuDataList = "newMenu"
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
添加事件按钮
@IBAction func didTapAddMenuButton(_ sender: Any) {
if (menuTextField.text?.isEmpty ?? true == false) {
let okAlert = UIAlertController(title: "保存されました。", message: "", preferredStyle: .alert)
let closeAction = UIAlertAction(title: "閉じる", style: .default) { (action: UIAlertAction) in }
okAlert.addAction(closeAction)
present(okAlert, animated: true, completion: nil)
if let text = menuTextField.text {
menuDataList[selectedParts]?.append(text)
menuDataList = userDefaults.dictionary(forKey: "keyMenuDataList") as? [String: [String]] ?? [:]
userDefaults.set(menuDataList, forKey: "keyMenuDataList")
}
} else {
let ngAlert = UIAlertController(title: "テキストが空です。", message: "", preferredStyle: .alert)
let closeAction = UIAlertAction(title: "閉じる", style: .default) { (action: UIAlertAction) in }
ngAlert.addAction(closeAction)
present(ngAlert, animated: true, completion: nil)
}
menuPickerView.reloadAllComponents()
}
UIPickerView 设置
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView,
numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 1{
return partsDataList.count
} else if pickerView.tag == 2{
return menuDataList[selectedParts]?.count ?? 0
} else {
return 0
}
}
func pickerView(_ picker: UIPickerView,
titleForRow row: Int,
forComponent component: Int) -> String? {
if picker.tag == 1 {
return partsDataList[row]
} else if picker.tag == 2 {
return menuDataList[selectedParts]?[row] ?? ""
} else {
return ""
}
}
func pickerView(_ pickerView: UIPickerView,
didSelectRow row: Int,
inComponent component: Int) {
if pickerView.tag == 1 {
partsLabel.text = partsDataList[row]
selectedParts = partsDataList[row]
menuPickerView.reloadAllComponents()
} else if pickerView.tag == 2 {
menuLabel.text = menuDataList[selectedParts]?[row] ?? ""
} else {
return
}
}
解决方案
您是否注册了 UserDefaults 键?
每次再次启动应用程序时都需要调用此函数。
UserDefaults.standard.register(defaults: [String : Any])
推荐阅读
- java - Spring 应用程序可用性(Liveness 和 Readiness)返回 404
- java - springSecurityFilterChain 有 3 个过滤器链都匹配集成测试中的任何请求,但应该只有一个
- rest - 使用 ASP Classic / JScript 在 IIS 上设置 REST API
- snowflake-cloud-data-platform - 将 JSON 多个值解析为行
- amazon-web-services - AppSync:管理管道中失败的功能
- r - 是否可以将一串列名传递给 tidy-select?
- azure-pipelines-release-pipeline - Azure Pipeline Releases - 下载工作项列表
- google-cloud-dns - 如何为“www”添加 Cname 以指向我在 Google Cloud DNS 中的实际域?
- sql - 如何计算clickhouse中的累积产品
- reactjs - 不能在打字稿中使用带有 Material-ui 样式类的反应组件