Как сохранить массив.То же самое после перезапуска приложения - PullRequest
0 голосов
/ 28 ноября 2018

Мне интересно, как сделать так, чтобы мой список дел оставался прежним после закрытия приложения.В моем коде я объявляю массив в самом начале, и я хочу знать, как я могу сохранить его обновленным для пользователя после того, как он перезапустил приложение.Я искал в Интернете некоторые ответы, но нашел только старые идеи о создании сущностей в раскадровке.И я почти уверен, что к настоящему времени должно быть что-то более красивое, чем добавление этого вручную.

Как сохранить массив при обновлении, чтобы он не потерялся после перезапуска приложения?

Мой код:

import UIKit

var checklist = ["Item 1", "Item 2"]

class ChecklistViewController: BaseViewController, UITableViewDelegate, UITableViewDataSource{

var newChecklistItemString: String?
var alertInputTextField: UITextField?

@IBOutlet weak var myTableView: UITableView!

let mainStoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

var selectedChecklist: [String] = []

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return (checklist.count)
}

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

    let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "cell")
    cell.textLabel?.font = UIFont.boldSystemFont(ofSize: 18.0)
    cell.textLabel?.text = checklist[indexPath.row]

    if selectedChecklist.contains(checklist[indexPath.row]) {
        cell.accessoryType = .checkmark
    }
    else{
        cell.accessoryType = .none
    }

    return cell
}

// checkmarks when tapped
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
    selectedChecklist.append(checklist[indexPath.row])
    tableView.deselectRow(at: indexPath, animated: true)
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        let value = checklist.remove(at: indexPath.row)
        myTableView.reloadData()
    }
}

override func viewDidAppear(_ animated: Bool) {
    myTableView.reloadData()
}

override func viewDidLoad() {
    super.viewDidLoad()

    addSlideMenuButton()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func addNewObject(_ sender: Any) {

    let alert = UIAlertController(title: "New Item", message: nil, preferredStyle: .alert)
    alert.addTextField { (alertInputTextField) in
        alertInputTextField.autocapitalizationType = .sentences
    }

    alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
        self.dismiss(animated: true, completion: nil)
    }))

    alert.addAction(UIAlertAction(title: "Add", style: .default, handler: { (action) in

        let textf = alert.textFields![0] as UITextField

        if(textf.text != "")
        {
            checklist.append(textf.text!)
        }
        self.myTableView.reloadData()

    }))

    self.present(alert, animated: true, completion: nil)

   }
}

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Найти это решение:

    // Use this code to fetch saved item list.
    if let items = UserDefaults.standard.value(forKey: "ItemListArray") as? [String] {
        print(items)
    }

    // Use this code to save your item list.
    let itemList = ["Item 1", "Item 2", "Item 3", "Item 4"]
    UserDefaults.standard.setValue(itemList, forKey: "ItemListArray")


    // Use this code to remove item list
    UserDefaults.standard.setValue(nil, forKey: "ItemListArray")
0 голосов
/ 28 ноября 2018

Проверьте код ниже: -

class ClassUserDefaults {

static let shared = ClassUserDefaults()

// MARK: - SETTER GETTER 
var selectedChecklist: [String]? {

    get {
        guard let savedItem =  (UserDefaults.standard.object(forKey: "selectedChecklist")) as? Data else { return nil }
        guard let data = NSKeyedUnarchiver.unarchiveObject(with: savedItem) as? [String]? else { return nil}
        return data
    }
    set {
        guard let value = newValue else {
            UserDefaults.standard.removeObject(forKey: "selectedChecklist")
            return
        }
        let item = NSKeyedArchiver.archivedData(withRootObject: value)
        UserDefaults.standard.set(item, forKey: "selectedChecklist")
        UserDefaults.standard.synchronize()
    }
}
}

использование в вашем ViewController: -

ClassUserDefaults.shared.selectedChecklist = selectedChecklist

также вы хотите установить, где вы хотите: -

cell.textLabel?.text = ClassUserDefaults.shared.selectedChecklist[indexPath.row]

Надеюсь, это поможет:)

0 голосов
/ 28 ноября 2018

Для простого строкового массива используйте UserDefaults

  • Объявите два метода для загрузки и сохранения данных

    func loadDefaults()
    {
       self.checklist = UserDefaults.standard.array(forKey: "checklist") as? [String] ?? []
    }
    
    func saveDefaults()
    {
       UserDefaults.standard.set(self.checklist, forKey: "checklist")
    }
    
  • In viewDidLoad add

    loadDefaults()
    
  • И сразу после добавления и удаления элемента добавьте

    saveDefaults()
    

Для более сложных данных другие решения, такие как Core Dataявляются предпочтительными


Примечание:

Вместо того, чтобы постоянно перезагружать все табличное представление, используйте API для вставки и удаления отдельных строк.Преимущество - приятная анимация.

В tableView:commit замените myTableView.reloadData() на

myTableView.deleteRows(at: [indexPath], with: .automatic)

и в действии предупреждения замените все выражение if на

if !textf.text!.isEmpty {
   let indexPath = IndexPath(row: checklist.count, section: 0)
   checklist.append(textf.text!)
   myTableView.insertRows(at: [indexPath], with: .automatic)
}

И переместить переменную checklist в класс!

...