当我将它留给另一个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但是它不能正常工作,我丢失了我的数据。
如何在每种情况下保留商店价值?
由于
答案 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)
可以有多种方法来保存数据:
Singleton - 此方法在应用程序运行时保留数据,即如果您终止该应用程序,则数据将丢失。
用户默认值
核心数据
存档/取消存档数据并将其存储在文件中
方法2,3和4在多个应用会话之间保留数据。