当我返回ViewControllerA时,如何在ViewControllerB中存储数据

时间:2017-08-03 08:32:46

标签: ios swift

当我将它留给另一个ViewController(A或C)时,我试图将存储数据保存在我的ViewControllerB中。

当我移动时,我不想在每个ViewController中传递数据,但我只想将它们存储在我的ViewControllerB中。

我可以做协议代理,但我认为更好的方法是可行的。

我在ViewController中有这个:

var contacts: [[String : String]] = [[:]]

我想保留这些存储在我的词典中的数据。

我这样做是为了初始化我的Dictionnary。

override func viewDidLoad() {
    contacts[0] = ["Name": "Me", "Number": "Hihi I'm not going to show my phone number here"]
    contactsTableView.tableFooterView = UIView()
}

当我继续使用ViewControllerC然后回到VCB它正在工作时,我的Dictionnary会保留值,但是当我转到ViewControllerA然后回到B时,我的词典是空的。

离开ViewControllerC并使用此方法返回B我

@IBAction func cancelButtonPressed(_ sender: Any) {
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}

编辑:所有导航代码:

ViewControllerA到B:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showContacts" {
        let vc = segue.destination as! ContactsViewController
    }
}

 @IBAction func contactsButtonPressed(_ sender: Any) {
    self.performSegue(withIdentifier: "showContacts", sender: (Any).self)
}

ViewController B到A:

 @IBAction func saveButtonPressed(_ sender: Any) {
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}

ViewController B到C:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showCreate" {
        let vc = segue.destination as! CreateViewController
        vc.delegate = self
    }
}

@IBAction func addButtonPressed(_ sender: Any) {
    performSegue(withIdentifier: "showCreate", sender: Any?.self)
}

和ViewController C到B:

@IBAction func cancelButtonPressed(_ sender: Any) {
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}

我试图将它用于离开B到A但是它不能正常工作,我丢失了我的数据。

如何在每种情况下保留商店价值?

由于

4 个答案:

答案 0 :(得分:1)

Swift 3.0代码......

首次打开时ViewControllerB,然后在UserDefaults中添加联系人词典 然后返回ViewControllerA并返回打开的ViewControllerB,然后检查UserDefaults是空还是非空。如果UserDefaults不为空,则从UserDefaults检索数据,并在UserDefaults

中显示其他设置数据
  

此代码添加viewWillAppear

中的ViewControllerB方法
 if  let data = UserDefaults.standard.object(forKey: key) {
  contacts = NSKeyedUnarchiver.unarchiveObject(with: data)
}
else {
    contacts[0] = ["Name": "Me", "Number": "Hihi I'm not going to show my phone number"]
    let archiver = NSKeyedArchiver.archivedData(withRootObject: contacts)
    UserDefaults.standard.set(archiver, forKey: key)
}

答案 1 :(得分:0)

问题是,当您从ViewControllerA打开ViewControllerB时,您正在创建一个新的ViewControllerB实例。 如果此数据的检索成本很高,那么保留数据是有意义的。否则,你可以在ViewControllerB的viewDidLoad中每次都获取它。

如果检索数据的成本很高,那么您可以使用以下选项来保存数据:

1。UserDefaults 2. Store it in a file on disk using Archiver 3. CoreData

上述存储选项的用例不同。对于NSUserDefaults,您只想存储光数据。使用上述存储选项之一后,您将检查数据是否已存在。如果它存在,则从存储中获取它或检索数据并存储它。

答案 2 :(得分:0)

通常,您应该将字典从A传递给B,使用委托模式,使用核心数据,存档或nsuserdefaults。

这实际上取决于您想要实现的目标以及数据的用途。

不推荐,但保持数据的简单方法是使用单例模式。

创建一个类并将其命名为StoredData:

import Foundation

class StoredData {

   static let sharedInstance = StoredData()

   var contacts: [[String : String]] = [[:]]
}

通过它,您可以使用

从任何地方访问和设置联系人
var contacts = StoredData.sharedInstance.contacts

或者

StoredData.sharedInstance.contacts[0] = ["Name": "Me", "Number": "Hihi I'm not going to show my phone number here"]

答案 3 :(得分:0)

可以有多种方法来保存数据:

  1. Singleton - 此方法在应用程序运行时保留数据,即如果您终止该应用程序,则数据将丢失。

  2. 用户默认值

  3. 核心数据

  4. 存档/取消存档数据并将其存储在文件中

  5. 方法2,3和4在多个应用会话之间保留数据。