在没有segue的情况下在多个视图控制器之间共享数据(Swift 3)

我正在做一个QR码扫描仪测验应用程序,用户必须从10个问题得到10分。 在用户第一个qn之后,分数加1,并且将它们还原到qr扫描器页面,在那里他们必须扫描下一个qn的QR码。 问题是分数数据的传递。 有没有办法做到这一点没有segue?

这是我的qn1controller

import UIKit class Quiz1Controller: UIViewController { @IBOutlet var question: UILabel! @IBOutlet var button1: UIButton! @IBOutlet var button2: UIButton! @IBOutlet var button3: UIButton! @IBOutlet var button4: UIButton! @IBOutlet var LabelEnd: UILabel! @IBOutlet var scorelabel: UILabel! var score = Int() var CorrectAnswer = String() override func viewDidLoad() { super.viewDidLoad() RandomQuestions() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func RandomQuestions(){ var RandomNumber = arc4random() % 1 RandomNumber += 1 switch(RandomNumber){ case 1: question.text = "Who is the current Deputy Chairman of People's Association?" button1.setTitle("Lee Hsien Loong", for: .normal) button2.setTitle("Chan Chun Sing", for: .normal) button3.setTitle("Goh Chok Tong", for: .normal) button4.setTitle("Goh Khen Swee", for: .normal) CorrectAnswer = "2" Hide() break default: break } } func Hide(){ LabelEnd.isHidden = true } func UnHide(){ LabelEnd.isHidden = false } @IBAction func Button1(_ sender: Any) { UnHide() if (CorrectAnswer == "1"){ self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } @IBAction func Button2(_ sender: Any) { UnHide() if (CorrectAnswer == "2"){ score = score + 1 scorelabel.text = "Score:\(score)" self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } @IBAction func Button3(_ sender: Any) { UnHide() if (CorrectAnswer == "3"){ self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } @IBAction func Button4(_ sender: Any) { UnHide() if (CorrectAnswer == "4"){ self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } } 

这是我的qn2控制器

 import UIKit class Quiz2Controller: UIViewController { @IBOutlet var question: UILabel! @IBOutlet var button1: UIButton! @IBOutlet var button2: UIButton! @IBOutlet var button3: UIButton! @IBOutlet var button4: UIButton! @IBOutlet var LabelEnd: UILabel! @IBOutlet var scorelabel: UILabel! var score = Int() var CorrectAnswer = String() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. RandomQuestions() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func RandomQuestions(){ var RandomNumber = arc4random() % 1 RandomNumber += 1 switch(RandomNumber){ case 1: question.text = "Who is the founder of People's Association?" button1.setTitle("Lee Hsien Loong", for: .normal) button2.setTitle("Lee Kuan Yew", for: .normal) button3.setTitle("Goh Chok Tong", for: .normal) button4.setTitle("Goh Khen Swee", for: .normal) CorrectAnswer = "1" Hide() break default: break } } func Hide(){ LabelEnd.isHidden = true } func UnHide(){ LabelEnd.isHidden = false } @IBAction func Button1(_ sender: Any) { UnHide() if (CorrectAnswer == "1"){ score = score + 1 scorelabel.text = "Score:\(score)" self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } @IBAction func Button2(_ sender: Any) { UnHide() if (CorrectAnswer == "2"){ self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } @IBAction func Button3(_ sender: Any) { UnHide() if (CorrectAnswer == "3"){ self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } @IBAction func Button4(_ sender: Any) { UnHide() if (CorrectAnswer == "4"){ self.performSegue(withIdentifier: "correct", sender: self) } else { LabelEnd.text = "Incorrect Answer! Try again" } } } 

故事板:

在这里输入图像说明

删除Seague并像下面这样做。 假设你想共享NSMutableDictionary

只需要一个variables作为你想与viewController共享的types。

对于Exa。 你想与ShareViewController共享数据,然后采取一个像

 var Dict_data = NSMutableDictionary() 

现在,您要在哪里导航,就像假设它是您的ShareViewController一样。 记住不要忘记把ShareViewController的标识符放入StoryBoard。

  let PV = self.storyboard?.instantiateViewController(withIdentifier: "ShareViewController") as! ShareViewController PV.data = dict_share_date self.navigationController?.pushViewController(PV, animated: true) 

这里dict_share_data是你的NSMutableDictionry 。 你可以采取任何types,但记住双方的types必须相同。 或者你可以做types铸造。

您可以使用AppDelegate在多个ViewController之间共享数据。 您可以随时保存,更新和检索AppDelegate中定义的数据。 这是我以前的答案使用它有效地使用Appdelegate.Do让我知道你是否需要Swift版本。

在你的AppDelegate中定义你的variables

 class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var points : String? // Declare your object .... other methods } //You can access the property to save and retrieve your file. You can save let app = UIApplication.shared.delegate as! AppDelegate app.points = "yourString" Yo can read properties from any viewcontroller as per your requirement as let app = UIApplication.shared.delegate as! AppDelegate let points = app.points? 

您也可以使用NSNotificationCenter在多个viewcontoller中共享数据。 请让我知道,如果你有查询重新执行相同的。

如果您需要在导航时将数据从一个视图控制器传递到另一个视图控制器,则还可以使用storyboard id来实例化viewcontoller,如@Jeetendra在他的答案中所解释的。