如何在编辑模式下重新排序数据后保存更改

时间:2017-10-05 15:48:43

标签: ios swift uitableview

我是快速发展的新手。我想实现一个UI表视图,它可以显示我的项目列表,如下图所示

how my table views

它工作正常,但当我移动项目位置然后我触摸完成按钮,重新启动应用程序后,我所做的每一个更改,重置为默认值。我搜索了很多,我发现我应该将它保存在用户默认值上。我阅读了很多文章,但我仍然不知道我应该怎么处理代码,如果有人可以按照我需要的方式编辑我的代码,我感谢 (重新排序更改可以节省设备,而不是每次打开应用程序时都不刷新)

这是我在viewController中的代码

   //  ViewController.swift
  //  Created by Sebastian Hette on 28.02.2017.

import UIKit

  class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var array = ["one", "two", "three", "four", "five"]

let defaults = UserDefaults.standard
//I defined user defaults here

 struct Constants {

    static let myKey = "myKey"
}
//I defined my static key here

@IBOutlet weak var myTableView: UITableView!
@IBOutlet weak var editButton: UIBarButtonItem!

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

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


    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")

    defaults.stringArray(forKey: Constants.myKey)
    //I retrieve user defaults here 


    cell?.textLabel?.text = array[indexPath.row]
    return cell!
}

//Allows reordering of cells
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool
{
    return true
}

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


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

    switch myTableView.isEditing {
    case true:
        editButton.title = "done"
    case false:
        editButton.title = "edit"
    }



    defaults.set(array, forKey: Constants.myKey)
    //I saved my user defaults here 
}


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


}

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


   }

1 个答案:

答案 0 :(得分:2)

首先,您需要一个UserDefaults对象:

let defaults = UserDefaults.standard

保存:

defaults.set(0, forKey: "myNumber")
defaults.set("hello", forKey: "myString")
defaults.set(["apple", "banana", "grape"], forKey: "myArray")

要检索:

defaults.integer(forKey: "myNumber")
defaults.string(forKey: "myString")
defaults.stringArray(forKey: "myArray") // you can also save any type of array by using defaults.array

您可以保存多种类型,包括数字(int,double,float等),字符串,布尔值,对象和数组。我建议将密钥存储在一个单独的常量或类似文件中,因为密钥值中的拼写错误可能会导致这种情况无法正常工作,而且您会在墙上试图找出一个更复杂的原因来解释为什么应用程序无法运行。一个例子:

static let myKey = "myKey"

并且使用将是

Constants.myKey

通过使用UserDefaults,您的应用即使在关闭后也会保存数据的顺序。而不是在ViewController中声明一个数组,而是在viewDidLoad中初始化数组。

修改

你几乎就在那里。我没有看到viewDidLoad方法,我相信您需要这种方法。这是我掀起的一个小样本:

class ViewController: UIViewController {

    var array = [String]() // declaring a String array
    let defaults = UserDefaults.standard // where the data will be stored

    override func viewDidLoad() {
        super.viewDidLoad()

        // this sets the array equal to the last saved array, or the default one if one has not been saved
        array = defaults.stringArray(forKey: myKey) ?? ["one", "two", "three", "four", "five"]
    }
}

每次准备好保存新的有序数组调用defaults.set(array, forKey: myKey)。在cellForRowAtIndexPath方法中,取出用于检索用户默认值的行,您现在不需要它就可以在viewDidLoad上检索它并将其设置为等于您的数组变量

如果是我,我会将用户默认值保存为moveRowAt方法的最后一行。