应用关闭后,不会保存用户默认值

时间:2017-02-01 07:55:09

标签: ios swift uitableview swift3 nsuserdefaults

我创建的应用程序是一个uitableview,它包含5个单元格[1, 2, 3, 4, 5]数组,可以在单击单元格时进行编辑。当你点击一个单元格时,我已经完成了它,它显示了一个警报视图和一个文本字段。您可以简单地编辑单元格。当我转到另一个视图控制器时,我保存了编辑。但问题是,当我尝试关闭应用程序并打开它时,它会回到默认的消息数量,如[1,2,3,4,5]。任何提示如何保存已编辑的单元格,但同时打开uitableview时会显示该数组。对不起我的英语不好。谢谢顺便说一句,我是新手编程抱歉这段代码

* Messages.Swift = tableview

class Messages: UITableViewController {

    @IBOutlet var uitableView: UITableView!

    var tField: UITextField!
    var index: Int?

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }

    override func viewWillAppear(_ animated: Bool) {

        //Get the array
        if let array = UserDefaults.standard.object(forKey:"messages") as? Array<String> {
            self.app.helper.messages = array
        }
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return app.helper.messages.count
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let messagesCell = app.helper.messages[indexPath.row]
        cell.textLabel?.text = messagesCell

        return cell

    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let path = tableView.indexPathForSelectedRow
        index = path?.row

        changeMessage()
    }

    func changeMessage() {

        let alert = UIAlertController(title: "Message", message: "Enter new preset message", preferredStyle: UIAlertControllerStyle.alert)

        alert.addTextField(configurationHandler: configurationTextField)

        let doneAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.default, handler:{ (UIAlertAction) in

            let modelString = self.tField.text
            self.app.helper.messages[self.index!] = modelString!
            self.app.helper.saveToDefaults()
            self.tableView.reloadData()

        })

        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

        alert.addAction(doneAction)
        alert.addAction(cancelAction)
        self.present(alert, animated: true, completion: nil)
    }

    func configurationTextField(textField: UITextField!){
        if (textField) != nil {
            tField = textField
            textField.text = app.helper.messages[index!]
        }
    }
}

* Helper.swift

class Helper {

var messages: [String] = ["1", "2", "3", "4", "5"]

    func saveToDefaults() {
        let defaults = UserDefaults.standard
        defaults.set(messages, forKey: "messages")
        defaults.synchronize()

    }
}

2 个答案:

答案 0 :(得分:0)

尝试在设置表视图委托之前加载用户默认值。因为表视图是使用您在帮助程序中分配的数据集加载的,而不是使用来自用户默认值的数据集加载的。

override func viewDidLoad() {
    super.viewDidLoad()

    //Get the array
    if let array = UserDefaults.standard.object(forKey:"messages") as? Array<String> {
        self.app.helper.messages = array
    }

    tableView.delegate = self
    tableView.dataSource = self
}

或者您可以在从用户defaut

加载数据集后显示视图中的表视图
override func viewWillAppear(_ animated: Bool) {

    //Get the array
    if let array = UserDefaults.standard.object(forKey:"messages") as? Array<String> {
        self.app.helper.messages = array
    }
    tableView.reloadData()
}

答案 1 :(得分:0)

尝试

override func viewWillAppear(_ animated: Bool) {

    //Get the array
    if let array = UserDefaults.standard.object(forKey:"messages") as? Array<String> {
        self.app.helper.messages = array
    }
    //make this array global(declare it below var index: Int?)
    tableView.reloadData()
}

let messagesCell = array[indexPath.row]