2017-11-28 3 views
0

Ich benutze einen UITabBarController, um eine Kontaktliste zu erstellen, aber wenn ich versuche, das Array zu speichern, um die Daten beim Neustart der App zu laden gibt mir Probleme, wo die Daten nicht ' t angezeigt. Ich verwende UserDefaults, um die Daten und die Wiederherstellung zu speichern, wenn die App neu gestartet wird.So speichern Sie ein Array in UserDefault

In diesem Code habe ich Daten aus einem Textfeld an das Array namens Liste gesendet.

In diesem Code drucke ich die Daten in einer Tabelle und versuche, es mit Benutzerstandardeinstellungen zu speichern.

import UIKit 

var list = [String]() 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if let x = UserDefaults.standard.object(forKey: "SavedValue") as? String { 
     return (x.count) 
    } 
    return (0) 
} 

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

    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell") 
    if let x = UserDefaults.standard.dictionary(forKey: "SavedValue") as? String { 
     cell.textLabel?.text = [x[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() 
} 

@IBOutlet weak var myTableView: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 
} 
+0

Wie deklarieren Sie List-Array in NewContactoViewController? und erklären Sie mehr, wie Sie ViewController kommunizieren? –

Antwort

0

Sie sparen eine Array von Strings aber Sie sind eine Einzelsaite (oder sogar ein Wörterbuch) zu lesen, die offensichtlich nicht funktionieren kann. Es gibt eine dedizierte Methode stringArray(forKey, um ein String-Array zu lesen.

Abgesehen von der Frage nie von UserDefaults lesen, um die Datenquelle in der Tabellenansicht Datenquelle und Delegatmethoden, tun Sie es in viewDidLoad oder viewWillAppear zum Beispiel

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    if let savedArray = UserDefaults.standard.stringArray(forKey: "SavedValue") { 
     list = savedArray 
    } 
    myTableView.reloadData() 
} 

die Datenquelle Array in Setzen Sie bevölkern der View-Controller. Eine globale Variable als Datenquelle ist eine sehr schlechte Programmiergewohnheit.

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    var list = [String]() 
    ... 

In numberOfRowsInSection Rückkehr der Anzahl der Elemente in list und return ist keine Funktion, es gibt keine Klammern

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

Samt in cellForRow. Holen Sie den Artikel von list und verwenden Sie wiederverwendbare Zellen und wieder ist return keine Funktion.

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    cell.textLabel?.text = list[indexPath.row] 
    return cell 
} 

Hinweis:

Bedenken Sie, dass UserDefaults der falsche Ort ist, Daten zwischen View-Controller zu teilen. Verwenden Sie Segmente, Callbacks oder Protokolle/Delegaten.

+0

Danke, es hilft mir sehr, der Grund, warum ich das Array als eine globale Variable deklarieren es war es von dem anderen Controller für den Tab-Controller zuzugreifen, wusste nicht, dass es eine schlechte Angewohnheit war. –

Verwandte Themen