Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在视图控制器之间保存数据?_Ios_Swift_Database_Segue_Viewcontroller - Fatal编程技术网

Ios 如何在视图控制器之间保存数据?

Ios 如何在视图控制器之间保存数据?,ios,swift,database,segue,viewcontroller,Ios,Swift,Database,Segue,Viewcontroller,我正在开发一个测验应用程序,一旦你正确回答了一个问题,视图控制器就会转到另一个视图控制器,通知用户他们答对了问题,然后单击按钮继续。但是,当我运行模拟器时,一旦数据转到下一个视图控制器,数据就不会被保存。一旦用户正确回答了一个问题,我希望这个问题不再被问。但是,从现在起,一旦您正确回答了一个问题并切换到要求您继续的视图控制器,您按下按钮切换回原始视图控制器,用户将被询问他们已经回答的问题。如何使要求用户继续保存原始视图控制器中的数据的视图控制器能够确保没有向用户询问他们已经正确回答的问题 以下是

我正在开发一个测验应用程序,一旦你正确回答了一个问题,视图控制器就会转到另一个视图控制器,通知用户他们答对了问题,然后单击按钮继续。但是,当我运行模拟器时,一旦数据转到下一个视图控制器,数据就不会被保存。一旦用户正确回答了一个问题,我希望这个问题不再被问。但是,从现在起,一旦您正确回答了一个问题并切换到要求您继续的视图控制器,您按下按钮切换回原始视图控制器,用户将被询问他们已经回答的问题。如何使要求用户继续保存原始视图控制器中的数据的视图控制器能够确保没有向用户询问他们已经正确回答的问题

以下是原始视图控制器的代码:

import UIKit

class ViewController: UIViewController {

var questionList = [String]()

func randomQuestion() {



    //random question
    if questionList.isEmpty {
        questionList = Array(QADictionary.keys)



    }




    let rand = Int(arc4random_uniform(UInt32(questionList.count)))
    questionLabel.text = questionList[rand]


    //matching answer values to go with question keys
    var choices = QADictionary[questionList[rand]]!

      questionList.remove(at: rand)



    //create button
        var button:UIButton = UIButton()

    //variables
    var x = 1
    rightAnswerBox = arc4random_uniform(4)+1


        for index in 1...4
        {



            button = view.viewWithTag(index) as! UIButton

            if (index == Int(rightAnswerBox))
            {
                button.setTitle(choices[0], for: .normal)

            }

            else {
                button.setTitle(choices[x], for: .normal)
                x += 1

            }


            randomImage()

        }
    }


let QADictionary = ["Who is Thor's brother?" : ["Atum", "Loki", "Red Norvell", "Kevin Masterson"], "What is the name of Thor's hammer?" : ["Mjolinr", "Uru", "Stormbreaker", "Thundara"], "Who is the father of Thor?" : ["Odin", "Sif", "Heimdall", "Balder"]]



//wrong view segue
func wrongSeg() {

   performSegue(withIdentifier: "wrongViewSegue", sender: self)

}

//proceed screen
func rightSeg() {

    performSegue(withIdentifier: "rightSeg", sender: self)
}

//variables
var rightAnswerBox:UInt32 = 0
var index = 0



//Question Label
@IBOutlet weak var questionLabel: UILabel!

//Answer Button
@IBAction func buttonAction(_ sender: AnyObject) {

if (sender.tag == Int(rightAnswerBox))


{
    print ("Correct!")
}

else if (sender.tag != Int(rightAnswerBox)) {

    wrongSeg()
print ("Wrong!")
    questionList = []
    }

    randomQuestion()

}

override func viewDidAppear(_ animated: Bool)
{
randomQuestion()


}




//variables
var seconds = 15
var timer = Timer()




override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.




}
以下是正确回答问题后视图控制器的代码:

import UIKit

class CorrectView: UIViewController {


//correct answer label
@IBOutlet weak var correctLbl: UILabel!

//background photo
@IBOutlet weak var backgroundImage: UIImageView!

func backToQuiz() {

    performSegue(withIdentifier: "continueSeg", sender: self)
}

@IBAction func `continue`(_ sender: Any) {

    backToQuiz()
}



override func viewDidLoad() {
    super.viewDidLoad()

}

如果您只想为应用程序的当前实例化保存以前提出的问题,您可以创建一个singleton。这涉及到创建一个单独的类,该类包含一个包含前面提出的问题的字段


如果您想在应用程序终止后保存以前提出的问题,请使用核心数据或用户默认值。

以下是存储数据并传递到viewController的方法:-

  • 创建自定义委托并将数据从一个视图控制器发送到 另一个但一旦你退出应用程序,它将不会保存数据

  • 第二个选项是创建singleton,但仅当它是
    当您需要从代码的任何位置访问数据时,必需

  • 第三种选择是使用用户默认值或核心数据,但只有在 想坚持下去吗


对问题页面使用分段是错误的。如果您有20个问题,那么每个问题将有20个不同的视图控制器。我的答案正确吗?不,我所有的问题都存储在一个视图控制器中的一个数组中。只需使用两个数组来存储结果。哪个问题回答正确,哪个错误。在最终结果中,只需将两个新数组与初始问题数组进行比较,或者如果您只想将点声明为结果,只需使用正确答案列表排列