带有数据传递错误的自定义单元格 segue - Swift
Custom cell segue with data pass error - Swift
我正在创建一个测验应用程序,table 视图向用户显示他们回答对/错的问题。当用户点击一个问题时,它会将他们带到一个显示问题解释的新页面。
澄清一下:
- 我已经正确标记了我的 segue 标识符
- 我通过控制从我的原型单元格拖动到 ExplanationViewController
在两个控制器之间创建了 link
- 我为我的自定义单元格创建了一个新的 class,它不在 xib 文件中
基本上我在点击单元格时遇到错误)线程 1:EXC_BAD_INSTRUCTION。我在下面的代码中概述了错误发生的位置。
class ResultsSummaryViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var questions: [String] = []
var finalResults: [Bool] = []
var explanation: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
println(questions)
println(finalResults)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.questions.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ResultTableViewCell
cell.questionLabel.text = questions[indexPath.row]
return cell
}
let testSegueIdentifier = "explanation"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == testSegueIdentifier) {
if let destination = segue.destinationViewController as? ExplanationViewController {
if let i = tableView.indexPathForSelectedRow()?.row { <-- ERROR HERE
destination.explanation = explanation[i]
}
} }
}
}
第二个视图控制器
class ExplanationViewController: UIViewController {
@IBOutlet weak var explanationLabel: UILabel!
var explanation = String()
override func viewDidLoad() {
super.viewDidLoad()
explanationLabel.text = explanation
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
在结果摘要之前查看控制器
var answers: [String] = []
var userAnswers: [Bool] = []
var correctAnswers: [Bool] = []
var finalResultsArray: [String] = []
var answerCount: [Bool] = []
var questionString: [String] = []
var explanationString: [String] = []
class QuizQuestion {
let question: String!
let answer: Bool!
let explanation: String!
var usersAnswer: Bool?
var answerSubmitted: Bool?
init(question: String, answer: Bool, explanation: String) {
self.question = question
self.answer = answer
self.explanation = explanation
}
}
let questions = [
QuizQuestion(question: "Do I like coffee?", answer: true, explanation: "Because it's awesome!"),
QuizQuestion(question: "Is bacon god's gift to mankind?", answer: true, explanation: "Because it's awesome!"),
QuizQuestion(question: "Should I take a nap right now?", answer: true, explanation: "You gotta review some code!"),
]
@IBAction func checkResults(sender: AnyObject) {
self.performSegueWithIdentifier("checkResults", sender: sender)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == "checkResults") {
var checkResults = segue.destinationViewController as! ResultsSummaryViewController
checkResults.questions = questionString
checkResults.finalResults = answerCount
checkResults.explanation = explanationString
}
}
func questionToString() {
for (index, _) in enumerate(questions) {
questionString.append(questions[index].question!)
}
}
func explanationToString() {
for (index, _) in enumerate(questions) {
explanationString.append(questions[index].explanation!)
}
}
根据您的代码,很可能您的 explanations
数组没有索引 i
.
的元素
您的数组说明中似乎没有任何数据可显示,请尝试使用此方法修复:
if let i = self.tableView.indexPathForSelectedRow()?.row {
if i <= explanation.count{
destination.explanation = explanation[i] <-- ERROR HERE
} else {
println("No explanationto display")
}
}
不过,我建议您使用一个字典数组,其中一个键用于问题,另一个键用于答案,以避免这种不匹配。
我正在创建一个测验应用程序,table 视图向用户显示他们回答对/错的问题。当用户点击一个问题时,它会将他们带到一个显示问题解释的新页面。
澄清一下:
- 我已经正确标记了我的 segue 标识符
- 我通过控制从我的原型单元格拖动到 ExplanationViewController 在两个控制器之间创建了 link
- 我为我的自定义单元格创建了一个新的 class,它不在 xib 文件中
基本上我在点击单元格时遇到错误)线程 1:EXC_BAD_INSTRUCTION。我在下面的代码中概述了错误发生的位置。
class ResultsSummaryViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var questions: [String] = []
var finalResults: [Bool] = []
var explanation: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
println(questions)
println(finalResults)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.questions.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ResultTableViewCell
cell.questionLabel.text = questions[indexPath.row]
return cell
}
let testSegueIdentifier = "explanation"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == testSegueIdentifier) {
if let destination = segue.destinationViewController as? ExplanationViewController {
if let i = tableView.indexPathForSelectedRow()?.row { <-- ERROR HERE
destination.explanation = explanation[i]
}
} }
}
}
第二个视图控制器
class ExplanationViewController: UIViewController {
@IBOutlet weak var explanationLabel: UILabel!
var explanation = String()
override func viewDidLoad() {
super.viewDidLoad()
explanationLabel.text = explanation
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
在结果摘要之前查看控制器
var answers: [String] = []
var userAnswers: [Bool] = []
var correctAnswers: [Bool] = []
var finalResultsArray: [String] = []
var answerCount: [Bool] = []
var questionString: [String] = []
var explanationString: [String] = []
class QuizQuestion {
let question: String!
let answer: Bool!
let explanation: String!
var usersAnswer: Bool?
var answerSubmitted: Bool?
init(question: String, answer: Bool, explanation: String) {
self.question = question
self.answer = answer
self.explanation = explanation
}
}
let questions = [
QuizQuestion(question: "Do I like coffee?", answer: true, explanation: "Because it's awesome!"),
QuizQuestion(question: "Is bacon god's gift to mankind?", answer: true, explanation: "Because it's awesome!"),
QuizQuestion(question: "Should I take a nap right now?", answer: true, explanation: "You gotta review some code!"),
]
@IBAction func checkResults(sender: AnyObject) {
self.performSegueWithIdentifier("checkResults", sender: sender)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if(segue.identifier == "checkResults") {
var checkResults = segue.destinationViewController as! ResultsSummaryViewController
checkResults.questions = questionString
checkResults.finalResults = answerCount
checkResults.explanation = explanationString
}
}
func questionToString() {
for (index, _) in enumerate(questions) {
questionString.append(questions[index].question!)
}
}
func explanationToString() {
for (index, _) in enumerate(questions) {
explanationString.append(questions[index].explanation!)
}
}
根据您的代码,很可能您的 explanations
数组没有索引 i
.
您的数组说明中似乎没有任何数据可显示,请尝试使用此方法修复:
if let i = self.tableView.indexPathForSelectedRow()?.row {
if i <= explanation.count{
destination.explanation = explanation[i] <-- ERROR HERE
} else {
println("No explanationto display")
}
}
不过,我建议您使用一个字典数组,其中一个键用于问题,另一个键用于答案,以避免这种不匹配。