簡體   English   中英

為什么每次更改視圖並返回視圖時,數組都會自我覆蓋-swift 3

[英]why does my array overwrite itself every time i change view and go back to it - swift 3

所以我有兩個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中。 我不知道這是怎么回事。 我感覺每次點擊“保存”按鈕都會創建一個新數組嗎?

到目前為止,我僅實現了eventTitle和eventLocation。

如果大家都無法理解我的意思,這是我的項目的鏈接https://mega.nz/#!XBxU1Q5J!cAhpRrZJo7an4ab8HmD1HtH7GSisScKOGoykGm9orJo

存檔數據和檢索存檔的數據將具有不同的內存引用。 如果再次保存,它將替換舊的。

經常使用應用程序的沙箱將是一個昂貴的過程。

  • 理想情況下,您必須在TableViewController類中初始化一個數組。
  • 將此數組引用傳遞給ViewController。
  • 在同一數組中添加/編輯/刪除對象。
  • 返回TableViewController並刷新表視圖。

  • 一般規則是在兩個控制器中具有相同的數組引用,並在需要時將其保存/檢索到應用程序的沙箱外。

現在,保存和檢索的點可以按照以下任一方式進行:

  1. 手動:保留一個按鈕以將陣列保存在應用程序沙箱中。 並在需要時檢索它。

  2. 將數組保存到AppDelegate的didEnterInBackground方法中,並在foreGround方法中進行檢索。 您需要某種機制來獲取AppDelegate中eventArray的引用。

希望這會有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM