2017-10-05 47 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

相關問題