如何再次保存和加载列表?

时间:2017-08-09 20:55:45

标签: ios swift save load

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

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

这是我在第一个视图Controller上的代码:

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.
}

}

1 个答案:

答案 0 :(得分:0)

好的,正如上面的评论中所述,在这种情况下你很可能会使用UserDefaults.standard,因为它只是你正在处理的少量数据。如果您希望每次更新数据时都要更新数据(添加/删除新项目),那么您应该进行一些代码重构,以便将保存部分包含在myTableView.reloadData()旁边。这是你如何做到的:

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

然后,您将在调用updateData()的任何地方调用myTableView.reloadData()(因此我明确表示:替换它,因为该方法已包含 reload 部分)。那是节省的部分。现在你必须处理 loading ,通常你会在AppDelegate方法的application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool类中执行此操作,但为了简单起见,我们只是教你如何在你内部完成它'em> 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!非常小心。始终执行安全铸造,因为如果失败,您的应用程序将崩溃。