首页 > 解决方案 > 字典类型中 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
        }
    }

标签: iosswiftxcode

解决方案


您是否注册了 UserDefaults 键?

每次再次启动应用程序时都需要调用此函数。

UserDefaults.standard.register(defaults: [String : Any])

推荐阅读