2017-05-28 45 views
0

我正在制作我的第一个应用程序,它有一个待办事项列表。列表项目存储在数组中并显示在Table View中,但是当关闭应用程序时,项目不再存在。我尝试使用用户默认值来保存项目,但它迄今还没有工作。我究竟做错了什么?我正在尝试使用保存数据的按钮。无法将用户创建的阵列保存到UserDefaults

///button to save the data 
@IBAction func savelist(_ sender: Any) { 

    let defaults = UserDefaults.standard 
    defaults.set(list, forKey: "SavedArray") 
    myTableView.reloadData() 
} 
//// retrieving the data 
override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    let defaults = UserDefaults.standard 
    let array = defaults.stringArray(forKey: "SavedArray") ?? [String]() 
    myTableView.reloadData() 

} 

我还说得那么,当我按下保存按钮,该阵列将被打印到控制台,让我知道,项目被添加到阵列中。问题是我无法保存这些项目。谢谢!

+0

名单是否包含定制NSObject的子类? –

+0

什么是“列表”?你确定它是'[String]'的类型吗? – ozgur

+0

我的数组被称为列表,并且字符串由用户输入。是的,我确定是一个字符串类型。它不包含自定义的nsobject子类。 –

回答

-1

您的问题似乎没有检索字符串数组,但将元素添加到数组中。

考虑定义您的列表,如果你还没有为[字符串]:

var list = [String]() 

如果你想在阵列使用以下方法来添加元素:

list.append(txtField.text!) 

我希望这个解决你的问题。祝你好运!

0

我解决了这个问题: 我的数组被称为名单,但是,关闭应用程序后检索数据当我使用

let array = defaults.stringArray(forKey: "SavedArray") ?? [String]()

所以我把它改为:

list = defaults.stringArray(forKey: "SavedArray") ?? [String]() 

我还添加了以前的答案。我的默认设置为全局变量,我增加

 defaults.synchronize() 

的按钮动作

+0

您并不想要调用'synchronize' – Paulw11

+0

@ Paulw11同步调用仍然是必要的,以防止在下一次自动同步发生之前用户终止应用程序的情况,在这种情况下数据实际上不会被保存 – zfetters

+0

@zfetters即不对。只有在线程可以访问默认值的情况下才需要同步。 UserDefaults使用直写缓存。新值将立即保存到磁盘。同步确保内存中缓存的值使用磁盘上的值进行刷新 – Paulw11