Segue 不传输数组
Segue doesn't transfer array
我似乎无法理解为什么每当我 运行 测试程序时数组 answers 都是空的。
当我在视图控制器 1 中使用 println(finalResultsSegue) 时,我可以看到结果数组,但是当我将它传递给视图控制器 2 中的答案时,它会转到下一个屏幕,但数组仍然是空的。
视图控制器 1
@IBAction func submitAll(sender: UIButton) {
let hasAnsweredAllQuestions = questions.reduce(true) { (x, q) in x && (q.usersAnswer != nil) }
println("has user answered all questions?: \(hasAnsweredAllQuestions)")
if hasAnsweredAllQuestions == true {
for (index, _) in enumerate(questions) {
userAnswers.append(questions[index].usersAnswer!)
correctAnswers.append(questions[index].answer!)
}
if userAnswers.count == 3 {
checkResults()
}
}
}
}
func checkResults() {
let answer = map(zip(correctAnswers, userAnswers)){
([=10=].0 == [=10=].1) ? "correct" : "wrong"
}
var finalResults = answer.map({"The following answer is \([=10=])"})
finalResultsSegue = finalResults
println(finalResultsSegue)
}
@IBAction func nextPage(sender: AnyObject) {
self.performSegueWithIdentifier("answerSummary", sender: sender)
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == "answerSummary") {
var answerSummary = segue.destinationViewController as! QuizResultsViewController
answerSummary.answers = finalResultsSegue
}
}
}
视图控制器 2
class QuizResultsViewController: UIViewController {
@IBOutlet weak var testLabel: UILabel!
var answers: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
println(answers)
}
您已将 prepareForSegue
作为 nextPage
中的嵌套函数。把它移到外面,它应该可以正常工作:
@IBAction func nextPage(sender: AnyObject) {
self.performSegueWithIdentifier("answerSummary", sender: sender)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if let answerSummary = segue.destinationViewController as? QuizResultsViewController
where segue.identifier == "answerSummary"
answerSummary.answers = finalResultsSegue
}
}
您不必在 func prepareForSegue...
前加上 override
的事实表明您将 prepareForSegue
放在了错误的位置。
另一种选择是使用结构来存储要从一个 ViewController 发送到另一个的任何 'global variables'。在结构内设置一个变量,只要结构是在 class 之外定义的,您就可以在项目内的任何其他 class 中访问它。
我似乎无法理解为什么每当我 运行 测试程序时数组 answers 都是空的。
当我在视图控制器 1 中使用 println(finalResultsSegue) 时,我可以看到结果数组,但是当我将它传递给视图控制器 2 中的答案时,它会转到下一个屏幕,但数组仍然是空的。
视图控制器 1
@IBAction func submitAll(sender: UIButton) {
let hasAnsweredAllQuestions = questions.reduce(true) { (x, q) in x && (q.usersAnswer != nil) }
println("has user answered all questions?: \(hasAnsweredAllQuestions)")
if hasAnsweredAllQuestions == true {
for (index, _) in enumerate(questions) {
userAnswers.append(questions[index].usersAnswer!)
correctAnswers.append(questions[index].answer!)
}
if userAnswers.count == 3 {
checkResults()
}
}
}
}
func checkResults() {
let answer = map(zip(correctAnswers, userAnswers)){
([=10=].0 == [=10=].1) ? "correct" : "wrong"
}
var finalResults = answer.map({"The following answer is \([=10=])"})
finalResultsSegue = finalResults
println(finalResultsSegue)
}
@IBAction func nextPage(sender: AnyObject) {
self.performSegueWithIdentifier("answerSummary", sender: sender)
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == "answerSummary") {
var answerSummary = segue.destinationViewController as! QuizResultsViewController
answerSummary.answers = finalResultsSegue
}
}
}
视图控制器 2
class QuizResultsViewController: UIViewController {
@IBOutlet weak var testLabel: UILabel!
var answers: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
println(answers)
}
您已将 prepareForSegue
作为 nextPage
中的嵌套函数。把它移到外面,它应该可以正常工作:
@IBAction func nextPage(sender: AnyObject) {
self.performSegueWithIdentifier("answerSummary", sender: sender)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if let answerSummary = segue.destinationViewController as? QuizResultsViewController
where segue.identifier == "answerSummary"
answerSummary.answers = finalResultsSegue
}
}
您不必在 func prepareForSegue...
前加上 override
的事实表明您将 prepareForSegue
放在了错误的位置。
另一种选择是使用结构来存储要从一个 ViewController 发送到另一个的任何 'global variables'。在结构内设置一个变量,只要结构是在 class 之外定义的,您就可以在项目内的任何其他 class 中访问它。