为啥每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3

Posted

技术标签:

【中文标题】为啥每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3【英文标题】:why does my array overwrite itself every time i change view and go back to it - swift 3为什么每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3 【发布时间】:2017-03-23 03:25:07 【问题描述】:

所以我有两个视图控制器。一个包含 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 中添加。我不知道这里发生了什么。我感觉每次点击“保存”按钮都会创建一个新数组?

目前我只实现了 eventTitle 和 eventLocation。

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

【问题讨论】:

retriveData() 只需在 viewdidload 中调用此方法,因此您的数组中没有重复 【参考方案1】:

归档数据和检索归档数据将具有不同的内存引用。如果您再次保存,它将替换旧的。

而且频繁地使用应用程序的沙盒将是一个昂贵的过程。

理想情况下,您必须在 TableViewController 类中初始化一个数组。 将此数组引用传递给 ViewController。 在同一数组中添加/编辑/删除对象。

回到 TableViewController 并刷新表格视图。

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

现在点保存和检索您可以通过以下任一方式进行:

    手动:保留一个按钮以将数组保存在应用沙箱中。并在需要时检索它。

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

希望这会有所帮助!

【讨论】:

感谢您的回答。我不确定您所说的“沙盒”一词是什么意思。另外,您是否可以通过代码显示如何解决我的问题?再次感谢! 沙盒是应用程序的目录结构所在的位置。您保存在目录或 userDefaults 中的所有内容都进入应用程序的沙箱。 ***.com/questions/12055990/… 谢谢!请问您可以通过代码显示如何解决我的问题吗?抱歉,我是新手,不胜感激!

以上是关于为啥每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3的主要内容,如果未能解决你的问题,请参考以下文章

为啥每次我在这个特定数据集上运行 train-test split 时我的内核都会死掉?

为啥当我返回时我的主视图控制器不会更新?

React Native 为啥每次点击 textInput 时我的键盘都会立即消失?

为啥我的 Vue 导航栏更改了路由但没有更新路由器视图?

我正在尝试计算 char 数组中的内容直到空终止,但是每次编译时我都会得到一个大于数组的数字

为啥当我重载数组运算符时我的私有变量为零? [关闭]