如何从 UIAlert 中分离并传递信息
How to segue from UIAlert and pass information
我对 Swift 和一般编程还很陌生。我正在制作一个测验应用程序,我想在我的测验视图控制器和一个新的视图控制器之间传输信息。我已经成功地做到了这一点,但现在我想使用 UIAlertView
来搜索信息。
我遇到的问题是,当它转换到新的视图控制器时,数组没有被填充。当我使用普通的 UI 按钮时,它可以正常工作,但使用 UI 警报时,它似乎不起作用。
用户提交答案
按下此按钮时,程序会检查用户是否已回答所有问题,然后创建一个 UIAlertView
- 如果用户按下是,则它应该转到下一个控制器并传递所需的信息,但事实并非如此。
目标视图控制器中的数组没有问题,因为它一直工作正常,直到我决定进行此切换。
@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 {
let alert: UIAlertView = UIAlertView()
alert.delegate = self
alert.title = "Submit Answers?"
alert.message = "If you click yes, your answers will be submitted. If you aren`t finished with the exam press continue."
alert.addButtonWithTitle("Yes")
alert.addButtonWithTitle("Continue")
alert.show()
println(userAnswers)
} else if hasAnsweredAllQuestions == false {
let alert = UIAlertView()
alert.title = "Hey, Wait!"
alert.message = "You have not answered all questions. Please finish the quiz."
alert.addButtonWithTitle("Ok")
alert.show()
}
}
开关/外壳功能
这里的程序将所有用户响应和正确答案附加到一个新数组中,并让它们准备好发送到下一个视图控制器。
作为调试模式,我创建了一个简单的 if 语句来确保数组被填充。
此处程序进入下一个视图控制器,但目标视图控制器中的数组未被填充。当我只使用一个简单的 UIButton
而不是警报时,它最初是有效的。
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int){
switch buttonIndex{
case 0: // Yes
for (index, _) in enumerate(questions) {
userAnswers.append(questions[index].usersAnswer!)
correctAnswers.append(questions[index].answer!)
println("this is working")
}
if userAnswers.count == 4 {
self.performSegueWithIdentifier("segue.push.alert", sender: self)
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == "segue.push.alert") {
var answerSummary = segue.destinationViewController as! ResultsViewController
answerSummary.correctAnswersResults = correctAnswers
answerSummary.userAnswersResults = userAnswers
}
}
}
break;
default: // Continue
NSLog("Default");
break;}
}
您的 prepareForSegue(_:sender:)
方法嵌入在您的 alertView(_:clickedButtonAtIndex:)
方法中。
虽然这在 Swift 中是合法的,但 UIKit 不会调用此方法。它必须是您的视图控制器子类中的一个方法(就像您的 alertView(_:clickedButtonAtIndex:)
方法)。
您可能想查看一些关于 Xcode 调试的文档;我认为在该方法中设置断点会告诉您它从未被调用过。
我对 Swift 和一般编程还很陌生。我正在制作一个测验应用程序,我想在我的测验视图控制器和一个新的视图控制器之间传输信息。我已经成功地做到了这一点,但现在我想使用 UIAlertView
来搜索信息。
我遇到的问题是,当它转换到新的视图控制器时,数组没有被填充。当我使用普通的 UI 按钮时,它可以正常工作,但使用 UI 警报时,它似乎不起作用。
用户提交答案
按下此按钮时,程序会检查用户是否已回答所有问题,然后创建一个 UIAlertView
- 如果用户按下是,则它应该转到下一个控制器并传递所需的信息,但事实并非如此。
目标视图控制器中的数组没有问题,因为它一直工作正常,直到我决定进行此切换。
@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 {
let alert: UIAlertView = UIAlertView()
alert.delegate = self
alert.title = "Submit Answers?"
alert.message = "If you click yes, your answers will be submitted. If you aren`t finished with the exam press continue."
alert.addButtonWithTitle("Yes")
alert.addButtonWithTitle("Continue")
alert.show()
println(userAnswers)
} else if hasAnsweredAllQuestions == false {
let alert = UIAlertView()
alert.title = "Hey, Wait!"
alert.message = "You have not answered all questions. Please finish the quiz."
alert.addButtonWithTitle("Ok")
alert.show()
}
}
开关/外壳功能
这里的程序将所有用户响应和正确答案附加到一个新数组中,并让它们准备好发送到下一个视图控制器。
作为调试模式,我创建了一个简单的 if 语句来确保数组被填充。
此处程序进入下一个视图控制器,但目标视图控制器中的数组未被填充。当我只使用一个简单的 UIButton
而不是警报时,它最初是有效的。
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int){
switch buttonIndex{
case 0: // Yes
for (index, _) in enumerate(questions) {
userAnswers.append(questions[index].usersAnswer!)
correctAnswers.append(questions[index].answer!)
println("this is working")
}
if userAnswers.count == 4 {
self.performSegueWithIdentifier("segue.push.alert", sender: self)
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == "segue.push.alert") {
var answerSummary = segue.destinationViewController as! ResultsViewController
answerSummary.correctAnswersResults = correctAnswers
answerSummary.userAnswersResults = userAnswers
}
}
}
break;
default: // Continue
NSLog("Default");
break;}
}
您的 prepareForSegue(_:sender:)
方法嵌入在您的 alertView(_:clickedButtonAtIndex:)
方法中。
虽然这在 Swift 中是合法的,但 UIKit 不会调用此方法。它必须是您的视图控制器子类中的一个方法(就像您的 alertView(_:clickedButtonAtIndex:)
方法)。
您可能想查看一些关于 Xcode 调试的文档;我认为在该方法中设置断点会告诉您它从未被调用过。