我试图将我的测验的问题随机化,如果答案不正确,则会出现segue。我想这可能与我的NewNumber((有关,但我想不通。
有时它适用于前3个问题,但即使通过按钮选择了正确的答案,segue也会被触发。
所以,我喜欢的是:-随机问题(没有重复,但我不得不删除列表。删除,因为它把正确答案搞砸了更多(-如果按下了错误的答案,我希望它触发到另一个屏幕的正确对应信息
我列出了完整的代码,因为我不知道它是否也与我的订单或函数有关。
class RoundThree: UIViewController {
@IBOutlet weak var FuelLevel: UIImageView!
@IBOutlet weak var QuestionLabel: UILabel!
@IBOutlet weak var Car: UIImageView!
@IBOutlet weak var SmallTown: UIImageView!
//Outlet for Buttons
@IBOutlet weak var OptionA: UIButton!
@IBOutlet weak var OptionB: UIButton!
@IBOutlet weak var OptionC: UIButton!
let allQuestions2 = QuestionBank2()
var questionNumber: Int = 0
var oldQNumber: Int = 0
var score: Int = 0
var selectedAnswer: Int = 0
var fuelleackage: CGFloat = 0
var wronganswer: Int = 0
let screenSize: CGRect = UIScreen.main.bounds
var questionsasked = [Int]()
override func viewDidLoad() {
newNumber()
startQuiz()
super.viewDidLoad()
}
@IBAction func answerPressed(_ sender: UIButton){
if sender.tag == selectedAnswer {
Car.frame.origin.x += 40
score += 1
fuelleackage += 0.0
NewYorkCity()
} else if sender.tag != selectedAnswer {
fuelleackage += 40.0
wronganswer += 1
EducateYourself()
NewYorkCity()
}
updateUI()
}
func updateQuestion(){
QuestionLabel.text = allQuestions2.list[oldQNumber].question
OptionA.setTitle(allQuestions2.list[oldQNumber].optionA, for: UIControl.State.normal)
OptionB.setTitle(allQuestions2.list[oldQNumber].optionB, for: UIControl.State.normal)
OptionC.setTitle(allQuestions2.list[oldQNumber].optionC, for: UIControl.State.normal)
selectedAnswer = allQuestions2.list[oldQNumber].CorrectAns
}
func updateUI(){
FuelLevel.frame.size.width = screenSize.width * (1.0-0.15 * CGFloat(wronganswer))
oldQNumber = questionNumber
newNumber()
updateQuestion()
questionsasked.append(questionNumber)
}
//Carol.frame.origin.x += 30
func startQuiz (){
score = 0
updateQuestion()
updateUI()
}
func NewYorkCity(){
if (Car.frame.origin.x + (Car.frame.width / 2)) > (SmallTown.frame.origin.x + SmallTown.frame.width) {
performSegue(withIdentifier: "FinishWindow", sender: self)
}
else if (screenSize.width * (1.0-0.15 * CGFloat(wronganswer)) <= 0)
{ performSegue(withIdentifier: "saaaad", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "PopUp2") {
let vc1 = segue.destination as! CorrectInfoPopUp2
vc1.InformationRoundNumber = oldQNumber
}
}
func EducateYourself(){
performSegue(withIdentifier: "PopUp2", sender: self)
}
func newNumber() {
for _ in 0..<allQuestions2.list.count {
var rand = Int(arc4random_uniform(UInt32(allQuestions2.list.count)))
while questionsasked.contains(rand) {
rand = Int(arc4random_uniform(UInt32(allQuestions2.list.count)))
}
questionNumber = rand
}
}
}
在newNumber
方法中,您将分配questionNumber
,但在为segue做准备时,您将oldQNumber
分配为vc1
的变量。因为你在调用newNumber
后不会更改oldQNumber
,我想你想通过questionNumber
vc1.InformationRoundNumber = questionNumber
与Robert Dresler所写的答案相同。
还有几个附加组件:
- 最好使用常量作为segue标识符,而不是具体字符串:
示例:
struct SegueIdentifiers {
static let popUp = "PopUp"
static let finishWindow = "FinishWindow"
}
这个角色并不安全:
if (segue.identifier == "PopUp2") { let vc1 = segue.destination as! CorrectInfoPopUp2 vc1.InformationRoundNumber = oldQNumber }
所以写这样的东西要好一点:
if segue.identifier == SegueIdentifiers.popUp, let vc = segue.destination as? CorrectInfoPopUp2 {
vc.InformationRoundNumber = questionNumber
}
- 如果使用swift 4.2,则可以使用
Int.random(0..<allQuestions2.list.count)
而不是Int(arc4random_uniform(UInt32(allQuestions2.list.count)))
p.S.如果你对如何编写可读性更强的代码感兴趣,你可以查看Raywenderlich的Swift Style Guide。