如何在 UserDefault 中保存数组

How to save an Array in UserDefault

我正在使用 UITabBarController 创建联系人列表,但是当我尝试保存数组以在我重新启动应用程序时加载数据时出现数据未显示的问题。我正在使用 UserDefaults 保存数据并在应用程序重新启动时恢复。

在这段代码中,我将数据从文本字段发送到名为列表的数组。

import UIKit

class NewContactoViewController: UIViewController {

@IBOutlet weak var input: UITextField!

@IBAction func add(_ sender: Any) {
    if (input.text != "") {

        list.append(input.text!)
        UserDefaults.standard.set(list, forKey: "SavedValue")
        input.text = ""
    }
}
}

在这段代码中,我在 table 中打印数据,并尝试使用用户默认设置保存它。

import UIKit

var list = [String]()

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if let x = UserDefaults.standard.object(forKey: "SavedValue") as? String {
        return (x.count)
    }
    return (0)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    if let x = UserDefaults.standard.dictionary(forKey: "SavedValue") as? String {
        cell.textLabel?.text = [x[indexPath.row]]
    }
    return(cell)
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCellEditingStyle.delete {
        list.remove(at: indexPath.row)
        myTableView.reloadData()
    }
}

override func viewDidAppear(_ animated: Bool) {
    myTableView.reloadData()
}

@IBOutlet weak var myTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

}
}

您正在保存一个字符串数组,但您正在读取一个单个字符串(甚至字典),这显然无法工作。有一个专门的方法stringArray(forKey来读取字符串数组。

除了从未从 UserDefaults 读取以填充 table 视图数据源和委托方法中的数据源的问题外,在 viewDidLoadviewWillAppear 中执行此操作例如

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let savedArray = UserDefaults.standard.stringArray(forKey: "SavedValue") {
        list = savedArray
    }
    myTableView.reloadData()
}

将数据源数组放入视图控制器。一个全局变量作为数据源是非常糟糕的编程习惯。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var list = [String]()
    ...

In numberOfRowsInSection return listreturn 中的项数不是函数,没有括号

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return list.count
}

cellForRow 相同。从 list 获取项目并使用可重复使用的单元格,return 不是函数。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = list[indexPath.row]
    return cell
}

注:

请考虑 UserDefaults 是在视图控制器之间共享数据的错误位置。使用转场、回调或协议/委托。