我会尽力解释我能解决的问题: 我有一个带有两个viewcontrollers的todo列表,你会在下面的代码中看到一些打印用于调试,我添加了一个“erase”(擦除用户默认)并检查(检查存储在userDefaults中的是什么)进行调试
我首先使用Erase清除userDefaults并且可以看到值为“nil”。 然后我将一个项目添加到我的列表中,例如汽车,它工作正常。 然后我添加第二个项目,如苹果,有时它可以工作,但90%的时间它只是取代汽车而不是添加到阵列;我可以通过勾选按钮看到它。
所以我最后的第一个问题是if循环只用打印函数替换了前一个值BUT我可以看到它是循环执行的第一部分,因为我可以在控制台中看到“first”所以它应该添加到数组???
很多次来自“清楚”;将前两项添加到我的列表工作中,但是从第二项开始,if函数总是用新项替换最后一项;保留以前的。
如果我清除了我的数据并获得了UserDefaults值的nil值,我仍然可以看到循环的第一部分正在执行而不是else
有时我会重新启动IOS模拟器并获取一个无处存储的值
现在我觉得有一个“toDo”标识符的错误,并将所有ID更改为“list”,只有else循环正在执行!!!
我不明白为什么我的代码如此混乱。我希望我足够清楚;感谢您的阅读
下面是我的代码(两个viewcontrollers;一个用于添加项目,另一个用于tableView)
First ViewController
var toDoStorage = UserDefaults.standard.object(forKey: "toDo")
var toDoList = [String] ()
@IBOutlet weak var itemLabel: UITextField!
@IBOutlet weak var reportLabel: UILabel!
@IBAction func checkButton(_ sender: Any) {
print(UserDefaults.standard.stringArray(forKey: "toDo") as Any)
}
@IBAction func eraseButton(_ sender: Any) {
let eraseDate = ""
UserDefaults.standard.set(eraseDate, forKey: "toDo")
print(UserDefaults.standard.stringArray(forKey: "toDo") as Any)
}
@IBAction func saveButton(_ sender: Any) {
if let tempArray = toDoStorage as? [String]{
toDoList = tempArray
print("first")
toDoList.append(itemLabel.text!)
} else {
toDoList = [itemLabel.text!]
print("else")
}
UserDefaults.standard.set(toDoList, forKey: "toDo")
itemLabel.text = ""
}
第二
@IBOutlet weak var table: UITableView!
var toDo = UserDefaults.standard.stringArray(forKey: "toDo") ?? [String]()
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return toDo.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "IDCell")
cell.textLabel?.text = String(describing: toDo[indexPath.row])
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
toDo.remove(at: indexPath.row)
table.reloadData()
UserDefaults.standard.set(toDo, forKey: "toDo")
}
}
override func viewDidAppear(_ animated: Bool) {
let dataCheck = UserDefaults.standard.object(forKey: "toDo")
if let newData = dataCheck as? [String] {
toDo = newData
table.reloadData()
}
在下面发布的答案(在我的新项目中替换为Do with list)
@IBAction func saveButton(_ sender: Any) {
if UserDefaults.standard.object(forKey: "list") as? [String] != nil {
toDoList = UserDefaults.standard.stringArray(forKey: "list")!
toDoList.append(itemLabel.text!)
} else {
toDoList = [itemLabel.text!]
}
UserDefaults.standard.set(toDoList, forKey: "list")
itemLabel.text = String()
toDoList = [String] ()
答案 0 :(得分:1)
键toDo
的值是一个字符串数组。要在func eraseButton
替换
let eraseDate = ""
与
let eraseDate = [String]()
答案 1 :(得分:0)
对我而言,第一件事就是你在String
和[String]
之间切换对应于" toDo"键。
尝试将空字符串更改为空数组[]
,看看是否可以解决一些问题。
答案 2 :(得分:0)
OURRAY 2天后,我第一次调试自己! :d 所以问题主要是关于两个方面的if语句:1)我的条件没有返回任何值因为我没有在末尾添加比较器然后2)在第一部分我没有在添加之前更新数组。以下是新代码:
@IBAction func saveButton(_ sender: Any) {
if UserDefaults.standard.object(forKey: "list") as? [String] != nil {
toDoList = UserDefaults.standard.stringArray(forKey: "list")!
toDoList.append(itemLabel.text!)
} else {
toDoList = [itemLabel.text!]
}
UserDefaults.standard.set(toDoList, forKey: "list")