UserDefaults和If / else不稳定的行为

时间:2017-08-21 14:20:02

标签: ios arrays swift uitableview nsuserdefaults

我会尽力解释我能解决的问题: 我有一个带有两个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] ()

3 个答案:

答案 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")