代码之家  ›  专栏  ›  技术社区  ›  Denisson de Souza

UserDefault不会在tableView Swift 4中保存数据

  •  0
  • Denisson de Souza  · 技术社区  · 7 年前

    我一直试图在重新加载应用程序时保存数据。然而,有些数据无法保存。

    my global variable
    
    let defaults = UserDefaults.standard
    

    这是我在AddTaskView上的代码

    @IBAction func addTask(_ sender: Any) {
    
        let date = datePicker.date
    
        let dateStr = dateFormatter.string(from: date)
    
        taskArray.append(selectedTask)
        dateArray.append(dateStr)
    
        defaults.set(selectedTask, forKey: "task")
        defaults.set(dateStr, forKey: "date")
    
        dismiss(animated: true, completion: nil)
    }
    

    在我的ViewController中,我有我的viewWillApper

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        defaults.string(forKey: "task")
        defaults.string(forKey: "date")
    
        tableView.reloadData()
    }
    

    如果我打印从AddTaskView返回的数据,它将在控制台上打印 但数据在重新加载应用程序时消失

    tableView.dataSource = self (saved in my viewDidLoad)
    

    这是我的tableView

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "taskCell", for: indexPath)
    
        cell.textLabel?.text = "\(indexPath.row + 1). \(taskArray[indexPath.row])"
    
        cell.detailTextLabel?.text = dateArray[indexPath.row]
    
        return cell
    }
    

    我做错了什么?

    谢谢

    2 回复  |  直到 7 年前
        1
  •  0
  •   Masashi    7 年前

    您要进行多个检查:

    1. defaults.string(forKey: "task") 具有您不使用的返回值

    2. 追加输入的数据时,请检查其是否已追加。

    3. 如果输入的值存在,请检查表的行数。

    我认为解决问题的关键在于以下几点之一。

        2
  •  0
  •   Denisson de Souza    7 年前

    花了我一段时间,但我最终发现

    @IBAction func addTask(_ sender: Any) {
    
        let date = datePicker.date
    
        let dateStr = dateFormatter.string(from: date)
    
        taskArray.append(selectedTask)
        dateArray.append(dateStr)
    
        defaults.set(taskArray, forKey: "task")
        defaults.set(dateArray, forKey: "date")
        defaults.synchronize()
    
        dismiss(animated: true, completion: nil)
    }
    
    func loadUserDefaults() {
        if let tempStr = defaults.stringArray(forKey: "task") {
    
    
    
            taskArray = tempStr as [String]
    
        }
    
        if let tempDateStr = defaults.stringArray(forKey: "date") {
    
    
    
            dateArray = tempDateStr as [String]
    
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        tableView.dataSource = self
        loadUserDefaults()
    }