2017-08-09 4 views
0

Ich versuche, eine einfache App mit einer Tabellenansicht zu programmieren, um einige Dinge zu zeigen. (In diesem Fall heißt es "Grails"/Dinge, die ich kaufen möchte).Wie kann ich eine Liste erneut speichern und laden?

Ich habe alles über die Tabellenansicht und die Eingabe und so weiter gemacht, und das einzige, was ich tun muss, ist, alle Informationen erneut zu speichern und zu laden. Aber ich weiß nicht wie.

Dies ist mein Code auf den ersten Blick 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() 
    } 
} 

und die zweite View-Controller sieht wie folgt aus:

import UIKit 

class SecondViewController: UIViewController { 

    @IBOutlet weak var input: UITextField! 

    @IBAction func addItem(_ sender: Any) { 
     if (input.text != "") { 
      list.append(input.text!) 
      input.text = "" 
     } 
    } 
} 

EDIT:

Jetzt Der Code sieht so, aber ich kann keine neuen Gegenstände der Liste von der Schaltfläche auf der zweiten Ansicht Controller hinzufügen?

Import UIKit

var list = [ "Nike Air Jordan 1 x Off White", "Balenciaga Geschwindigkeit Trainer", "Gucci Snake Sneakers", "Goyard Kartenhalter"]

Klasse FirstViewController: UIViewController wie in den Kommentaren oben genannten Sie können sehr gut, 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. 
} 

}

+0

Zeigt die erste Liste wie gewünscht an? Ich meine, das einzige Problem ist das Update oder haben Sie Probleme von Anfang an?Wenn ja, posten Sie bitte den gesamten Code. Auf der anderen Seite, wenn dies Ihr ** gesamter ** Code ist, dann ist Ihr Problem, dass Sie nicht Ihre Tabellendarstellung 'delegate' setzen. –

+0

Ich bin ziemlich ein Neuling, ahah. Aber das ist der gesamte Code, und dann gibt es am Ende die Funktionen viewDidLoad und didReceiveMemoryWarning, wie sie am Anfang waren. Die Liste wird angezeigt, wie es sollte, und funktioniert einwandfrei. Ich kann hinzufügen und löschen, wie ich möchte. Ich muss nur wissen, wie man die Daten speichert und lädt, wenn die App wieder geöffnet wird. :) –

+0

Ahh Sie sehen, dann ist das die eigentliche Frage (Sie mussten genauer sein). Es gibt mehrere Möglichkeiten, dies zu handhaben. Wenn Ihre Daten klein sind (<1 Mb), dann ist "UserDefaults.standard" der schnellste und einfachste Weg. Wenn nicht, dann solltest du darüber nachdenken, mehr über _CoreData_ zu lesen oder sogar einen 'pod' dafür zu verwenden, wie Realm –

Antwort

0

Ok, verwendenin diesem Fall, da es sich um eine kleine Datenmenge handelt. Wenn Sie möchten, dass Sie Ihre Daten jedes Mal aktualisieren möchten, wenn sie aktualisiert wird (fügen Sie ein neues Element hinzu), sollten Sie ein Code-Refactoring durchführen, um den Teil mit neben Ihrer myTableView.reloadData() zu integrieren. Hier ist, wie Sie es tun:

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

Dann werden Sie updateData() Aufruf überall Sie riefen myTableView.reloadData() (nur so machte ich mich klar: es ersetzen, da das Verfahren beinhaltet bereits die reload Teil). Das war's für den sparsamen Teil. Nun müssen Sie behandeln die Laden, in der Regel würden Sie dies tun in der AppDelegate Klasse in der application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool Methode, aber der Einfachheit halber wollen wir nur beibringen, wie man es tun in dir schon sind viewDidLoad() Methode in der FirstViewController Klasse fehlt:

override func viewDidLoad() { 
    if let storedList = UserDefaults.standard.value(forKey: "list") { 
     list = storedList as! [String] 
    } else { 
     print("No list previously stored") 
    } 
} 

Wenn ein vorheriges list gespeichert wurde, dann den Wert ersetzen. Andernfalls wird die Nachricht nur als Bestätigung ausgegeben (Sie können sie in Zukunft löschen, wenn Sie möchten, um das Protokoll der Konsole für nützliche Dinge zu behalten).

Eine letzte Sache, die ich sagen muss, ist, dass ich ein Kraftguss tat seit dem storedList, da ich für eine Tatsache wusste, es war ein String Array, aber Sie sollten sehr vorsichtig mit as! vorsichtig sein. Führen Sie immer ein sicheres Casting durch, da die App im Falle eines Ausfalls abstürzen wird.

+0

Ich fühle mich jetzt sehr blöd. Entschuldige, wenn ich deine Zeit verschwende, aber ich schätze es sehr! Nun, ich denke, ich habe getan, was du gesagt hast, und ich habe es irgendwie verstanden. Aber jetzt wird nichts hinzugefügt, wenn ich auf die Schaltfläche Hinzufügen auf meinem SecondViewController klicke. –

+0

Bearbeitete den Beitrag, um den Code anzuzeigen :) –

+0

Mm alles sieht gut aus in Ihrem _FirstViewController_, ist das der gesamte _SecondViewController_ code? –

Verwandte Themen