UITableViewCell中的UserDefaults未保存(swift3)

时间:2017-08-28 22:35:50

标签: ios uitableview cell nsuserdefaults

我的代码现在只列出您手动输入的内容。但是,当用户切换视图控制器时,代码将消失。我尝试使用userdefualts将当前代码保存在选择函数的行数中,但它不会将项目保存在tableview单元格中。我只想保存tableview单元格中的任何内容。

import UIKit

class ViewController: UIViewController, UITableViewDataSource {

var items: [String] = [""]


@IBOutlet weak var listTableView: UITableView!
@IBAction func addItem(_ sender: AnyObject) {
    alert()
}

@IBOutlet weak var webView: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()
    listTableView.dataSource = self



}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "listitem") as! ItemTableViewCell
    cell.itemLabel.text = items[indexPath.row]

    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsets.zero
    cell.layoutMargins = UIEdgeInsets.zero




    return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let userDefaults = UserDefaults.standard

    userDefaults.setValue(items, forKey: "items")
    userDefaults.synchronize()
    return items.count



}
func alert(){
    let alert = UIAlertController(title: "", message: "", preferredStyle: .alert)
    alert.addTextField{
        (textfield) in
        textfield.placeholder = " Enter "

    }
    let add = UIAlertAction(title: "Add", style: .default){
        (action) in
        let textfield = alert.textFields![0] 

        self.items.append(textfield.text!)

        self.listTableView.reloadData()
    }
    let cancel = UIAlertAction(title: "Cancel", style: .cancel) {
        (alert) in


    }
    alert.addAction(add)
    alert.addAction(cancel)

    present(alert, animated: true, completion: nil)

}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    items.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .automatic)


}}

1 个答案:

答案 0 :(得分:1)

您的代码中存在许多问题:

  1. 您永远不会从UserDefaults重新加载数据。 - 这是最重要的一个
  2. 无需致电synchronise
  3. 您应该在添加/删除数据时保存数据,而不是numberOfRowsInSection
  4. 如果插入新行而不是重新加载整个表格,它会更好看
  5. 我会建议像:

    import UIKit
    
    class ViewController: UIViewController, UITableViewDataSource {
    
        var items = [String]()
    
        @IBOutlet weak var listTableView: UITableView!
        @IBAction func addItem(_ sender: AnyObject) {
            alert()
        }
    
        @IBOutlet weak var webView: UIWebView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            listTableView.dataSource = self
    
            self.items = UserDefaults.standard.stringArray(forKey:"items")  ?? [String]()
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "listitem") as! ItemTableViewCell
            cell.itemLabel.text = items[indexPath.row]
    
            cell.preservesSuperviewLayoutMargins = false
            cell.separatorInset = UIEdgeInsets.zero
            cell.layoutMargins = UIEdgeInsets.zero
    
            return cell
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return items.count    
        }
    
        func saveData() {
            userDefaults.standard.set(items, forKey: "items")
        }
    
        func alert(){
            let alert = UIAlertController(title: "", message: "", preferredStyle: .alert)
            alert.addTextField{
                (textfield) in
                textfield.placeholder = " Enter "
    
            }
            let add = UIAlertAction(title: "Add", style: .default){
                (action) in
                guard let textfield = alert.textFields?.first else {
                    return
                }
    
                if let newText= textfield.text {
                    self.items.append(newText)
                    saveData()
                    let indexPath = IndexPath(row: items.count - 1, section: 0)
                    self.listTableView.insertRows(at: [indexPath], with: .automatic)
                }
            }
    
            let cancel = UIAlertAction(title: "Cancel", style: .cancel) {
                (alert) in
    
            }
    
            alert.addAction(add)
            alert.addAction(cancel)
    
            present(alert, animated: true, completion: nil)
    
        }
    
        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
            items.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .automatic)
            saveData()
    
        }
    }
    

    此外,您不应该以这种方式真正使用UserDefaults进行数据存储,但我认为这只是一个简单的学习练习。