每次我改变视图并回到它时,为什么我的数组会覆盖自己 - 快速3

时间:2017-03-23 03:25:07

标签: ios arrays uitableview swift3

所以我有两个viewControllers。一个包含tableView以显示数组中的数据。第二个viewController用于在数组中添加内容。

这是我的viewController文件:

    import UIKit

    class ViewController: UIViewController {


        @IBOutlet weak var txtTitle: UITextField!

        @IBOutlet weak var txtLocation: UITextField!

        @IBOutlet weak var txtDate: UITextField!

        @IBOutlet weak var txtTime: UITextField!

        var eventsArray = [Event]()


        override func viewDidLoad() {
            super.viewDidLoad()
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }


        @IBAction func btnSave() {

            let newEvent = Event(eventTitle: txtTitle.text!, eventLocation: txtLocation.text!)

            eventsArray.append(newEvent)

            let savedEvents = NSKeyedArchiver.archivedData(withRootObject: eventsArray)

            UserDefaults.standard.set(savedEvents, forKey: "savedEvents")

            UserDefaults.standard.synchronize()   
        }

这是我的tableView:

import UIKit

class EventsTable: UIViewController, UITableViewDataSource, UITableViewDelegate{

    //var tableData = ViewController()

    var events = [Event]()

    @IBOutlet weak var table: UITableView!

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return events.count
    }


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

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomeCell

        cell.title.text = events[indexPath.row].title

        cell.location.text = events[indexPath.row].location

        return cell

    }


    func retriveData(){
        if let data = UserDefaults.standard.object(forKey: "savedEvents") as? Data {

            if let storedData = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Event]{
                events = storedData
            }

        }
    }

    override func viewDidAppear(_ animated: Bool) {

        retriveData()

        table.reloadData()

    }
}

这是我的用户界面: main.storyboard

现在,每次我添加一个事件并返回到我的tableView时,它只显示单元格中的标题,即使我有自定义单元格设置(这是问题之一)。其他问题,主要是,如果我回到我的viewController添加另一个事件,它添加它但它覆盖旧数组,它显示我添加的最新事件并替换旧事件,只显示新事件我在tableView中添加。我不知道这里发生了什么。我有一种感觉,每次我点击" Save"按钮它会创建一个新数组吗?

到目前为止,我只实现了eventTitle和eventLocation。

如果你所有人都无法理解我的意思,那么这是我项目的链接 https://mega.nz/#!XBxU1Q5J!cAhpRrZJo7an4ab8HmD1HtH7GSisScKOGoykGm9orJo

1 个答案:

答案 0 :(得分:0)

归档数据并检索归档数据将具有不同的内存引用。如果你再次保存它将取代旧的。

经常使用应用程序的沙箱将是一个昂贵的过程。

  • 理想情况下,您必须在TableViewController类中初始化一个数组。
  • 将此数组引用传递给ViewController。
  • 在同一个数组中添加/编辑/删除对象。
  • 返回TableViewController并刷新表格视图。

  • 一般规则是在两个控制器中都使用相同的数组引用,并在需要时将其保存/检索到应用程序的沙箱中。

现在保存和检索的重点可以通过以下任一方式完成:

  1. 手动:按住按钮将数组保存在应用程序沙箱中。并在需要时检索它。

  2. 将数组保存在AppDelegate的didEnterInBackground方法中,并在foreGround方法中检索它。您需要有一些机制来获取AppDelegate中eventArray的引用。

  3. 希望这会有所帮助!