【问题标题】:How to save and load a list again?如何再次保存和加载列表?
【发布时间】:2018-01-17 22:10:04
【问题描述】:

我正在尝试编写一个带有表格视图的简单应用程序,以显示一些要做的事情。 (在这种情况下,它被称为“Grails”/我想买的东西)。

我做了所有关于表格视图、输入等的事情,而我唯一需要做的就是再次保存和加载所有信息。但我不知道怎么做。

这是我在第一个视图控制器上的代码:

import UIKit

var list = ["Nike Air Jordan 1 x Off White", "Balenciaga Speed Trainers", "Gucci Snake Sneakers", "Goyard Card Holder"]

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var myTableView: UITableView!

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

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
        cell.textLabel?.text = list[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()
    }
}

第二个视图控制器看起来像这样:

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var input: UITextField!

    @IBAction func addItem(_ sender: Any) {
        if (input.text != "") {
            list.append(input.text!)
            input.text = ""
        }
    }
}

编辑:

现在代码看起来像这样,但我不能从第二个视图控制器上的按钮向列表中添加任何新项目?

导入 UIKit

var list = [“Nike Air Jordan 1 x Off White”、“Balenciaga Speed Trainers”、“Gucci Snake Sneakers”、“Goyard Card Holder”]

类 FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var myTableView: UITableView!


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

func updateData() {
    UserDefaults.standard.set(list, forKey: "list")
    myTableView.reloadData()
}

//LOADING THE DATA AGAIN
override func viewDidLoad() {
    if let storedList = UserDefaults.standard.value(forKey: "list")
    {
        list = storedList as! [String]
    }
    else
    {
        print("No list previously stored")
    }
}


public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    cell.textLabel?.text = list[indexPath.row]

    return cell
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
{
    if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark
    {
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
    }
    else
    {
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
    }
}



func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool
{
    return true
}


func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)
{
    let item = list[sourceIndexPath.row]
    list.remove(at: sourceIndexPath.row)
    list.insert(item, at: destinationIndexPath.row)
}

@IBAction func edit(_ sender: Any)
{
    myTableView.isEditing = !myTableView.isEditing

    switch myTableView.isEditing {
    case true:
        editButtonItem.title = "Done"
    case false:
        editButtonItem.title = "Edit"
    }
}


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

override func viewDidAppear(_ animated: Bool) {
    updateData()
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

【问题讨论】:

  • 第一个列表是否按预期显示?我的意思是,唯一的问题是更新还是从一开始就有问题?如果是这样,请发布整个代码。另一方面,如果这是你的整个代码,那么你的问题是你没有设置你的tableview delegate
  • 我几乎是个新手,啊哈。但这是完整的代码,然后是最后的 viewDidLoad 和 didReceiveMemoryWarning 函数,就像它们在开始时一样。该列表按应有的方式显示,并且运行良好。我可以根据需要添加和删除它。我只需要知道如何在应用重新打开时保存和加载数据。 :)
  • 啊,你看,那才是真正的问题(你需要更具体)。有几种方法可以解决这个问题,如果您的数据很小(UserDefaults.standard 是最快和最简单的方法。如果不是,那么您必须考虑阅读有关 CoreData 的更多信息,甚至使用 pod 来解决它,例如 Realm
  • 谢谢!但是我的问题是;在这种情况下如何使用 UserDefaults?
  • 给我几分钟,我会在下面回复一个格式化的回复。

标签: ios swift save load


【解决方案1】:

好的,正如上面的 cmets 所述,在这种情况下,您可以很好地使用 UserDefaults.standard,因为您正在处理的数据量很小。如果您希望每次更新数据时都更新数据(添加/删除新项目),那么您应该进行一些代码重构,将 saving 部分包含在您的myTableView.reloadData() 旁边。以下是你的做法:

func updateData() {
    UserDefaults.standard.set(list, forKey: "list")
    myTableView.reloadData()
}

然后你会在任何你调用myTableView.reloadData() 的地方调用updateData()(所以我明确表示:替换它,因为该方法已经包含 reload 部分)。这就是节省部分。现在您必须处理 加载,通常您会在 application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 方法的 AppDelegate 类中执行此操作,但为简单起见,我们只教您如何在您已经丢失的内部执行此操作FirstViewController 类中的viewDidLoad() 方法:

override func viewDidLoad() {
    if let storedList = UserDefaults.standard.value(forKey: "list") {
        list = storedList as! [String] 
    } else {
        print("No list previously stored")
    }
}

如果存储了任何以前的list,则替换该值。否则,它会打印消息作为确认(如果需要,您可以在将来删除它,以便保留控制台日志以获取有用的内容)。

我必须说的最后一件事是我做了一个强制转换,因为我使用storedList,因为我知道它是一个String 数组,但你应该非常小心地使用as!。始终执行安全投射,因为万一出现故障,您的应用会崩溃。

【讨论】:

  • 我现在感觉很愚蠢。对不起,如果我在浪费你的时间,但我真的很感激!现在,我想我按照你说的做了,我有点明白了。但是现在,当我单击 secondViewController 上的添加按钮时,什么都没有添加。
  • 嗯,在你的 FirstViewController 中一切看起来都很好,是整个 SecondViewController 代码吗?
  • 所有关于添加等的工作都很完美,如果我改回来仍然可以。所以我认为它是第一个。 (发表了一篇名为“如何使警报中的取消按钮取消操作”的帖子,我在其中发布了我的 secondViewController 代码,请您看一下。):D
  • 请给个链接?
猜你喜欢
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
相关资源
最近更新 更多