我有一系列答案和一系列按钮。当我单击特定按钮时,借助发件人tag,我会更改索引。我还需要在override func prepare(for segue: UIStoryboardSegue, sender: Any?)
中执行此操作,以便答案是由索引设置的,结果将转到另一个屏幕。
当我尝试创建sender.tag时,我有错误
类型的价值"有?"没有会员'tag'
@IBAction func answerPressed(_ sender: UIButton) {
let index = sender.tag
let currentAnswer = currentQuestions?.answers[index]
if currentAnswer!.type != .next {
performSegue(withIdentifier: "segue", sender: sender)
} else {
currentQuestions = currentAnswer!.nextQuestion
updateTittles(currentQuestions)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let index = sender.tag
let currentType = currentQuestions?.answers[index].type
let resultViewController = segue.destination as! ResultViewController
resultViewController.type = currentType
}
在这种情况下,为segue函数做准备的 sender
不一定是 UIButton
,而是segue发起的任何东西。您可以通过尝试将其投入到以下方式时检查是否是一个按钮:
if let button = sender as? UIButton {
index = button.tag
}
您也可以做的是在answerPressed
功能中而不是执行SEGUE,您可以自己在此处实例化ResultViewController
,然后推到它。因为当您使用此功能时,您知道发件人是UIButton
,并且应该具有标签。
as 任何的东西都可以是 sender
的类型。参数被声明为 Any
首先检查SEGUE的identifier
,在成功的力量下 sender
参数到UIButton
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "segue" else { return }
let button = sender as! UIButton
let currentType = currentQuestions?.answers[button.tag].type
let resultViewController = segue.destination as! ResultViewController
resultViewController.type = currentType
}
但不必通过整个UIButton
实例,标签/索引就足够了,或者 - 更有效 - 通过currentAnswer.type
@IBAction func answerPressed(_ sender: UIButton) {
let index = sender.tag
let currentAnswer = currentQuestions?.answers[index]
if currentAnswer!.type != .next {
performSegue(withIdentifier: "segue", sender: index)
} else {
currentQuestions = currentAnswer!.nextQuestion
updateTittles(currentQuestions)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "segue" else { return }
let index = sender as! Int
let currentType = currentQuestions?.answers[index].type
let resultViewController = segue.destination as! ResultViewController
resultViewController.type = currentType
}
类型的价值"有?"没有会员'tag'
表示Any
对象确实没有tag
属性。您知道您的sender
是UIButton
,那么为什么不 cast 将prepareForSegue
的sender
转到UIButton
对象,例如So?
guard let buttonSender = sender as? UIButton else { return }