2017-10-05 29 views
1

我对于快速开发来说是全新的。我想实现一个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. 
} 


    } 
+0

如果您在下次重新启动应用程序时未以用户默认值保存更新的数组,则“数组”会在viewController中重新初始化。你必须从用户默认值中获取数组。 – AshokPolu

+0

@AshokPolu非常感谢你。我对swift完全陌生,我花了很多精力去找到我应该做的事情,但我找不到。我会很感激,如果你可以更新确切的代码保存和读取数组在用户默认 –

回答

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,双,浮法,等等),字符串,布尔值,对象和数组。我建议将密钥存储在单独的常量或类似文件中,因为键值中的拼写错误可能会导致此操作无法正常工作,并且您会在墙上猛击头部,试图弄清楚为什么您的应用程序不是更复杂的原因没有工作。举个例子:

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方法中的最后一行。

+0

非常感谢你的版本。我按照从指南中获得的方式更新了代码,但仍未保存用户列出的更改。我在定义数组的代码下,在第一个视图控制器代码中定义了我的键,然后通过在'@IBAction func edit(_ sender:Any)'加载并在'cellForRowAt'中检索'来保存。我非常感谢你的帮助。谢谢 –

+0

我再次测试了在自己的代码中定义了我的密钥,如defaults.stringArray(forKey:“mykey”)和defaults.set(array,forKey:“myKey”),但stil不起作用。如有可能请请帮忙。 –

+1

@nedaDerakhshesh我已经发布了一个编辑我的回答,详细说明这个过程 – CodeNinja

相关问题