道歉,如果这已经在其他地方得到解答了 - 我花了最后两个小时尝试使用类似的建议做不同的事情,但我仍然无法解决它!
基本上,我有一个带有自定义单元格的UITableView(用于不同的测验主题),按下时,应该允许应用程序转到下一个VC并传递一个整数,以便下一个VC知道要加载哪个测验。在我的表视图VC中我有这个:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
rowPressed = indexPath.row
print ("rowPressed = \(rowPressed) before VC changes")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is GameVC {
let vc = segue.destination as? GameVC
vc?.toPass = rowPressed
print("I ran...")
} else {
print("You suck")
}
在我的GameVC中我有这个:
var toPass = Int()
override func viewDidLoad() {
super.viewDidLoad()
print("toPass = \(toPass)")
运行时的控制台输出是:
I ran...
toPass = 0
rowPressed = 3 before VC changes
因此看起来VC在前一个之前发生了变化,可以发送正确的toPass值。我该如何解决这个问题?
非常感谢提前!
答案 0 :(得分:3)
根据segue描述:
例如,如果segue源自表视图,则sender参数将标识用户点击的表视图单元格。
因此,发件人是UITableViewCell
,你可以这样做:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let cell = sender as? UITableViewCell else { return }
guard let idx = tableView.indexPath(for: cell) else { return }
guard let vc = segue.destination as? GameVC else { return }
vc.toPass = idx.row
}
在prepare(segue:)
之前调用了代码tableView(didSelectRowAt:)
的问题。
答案 1 :(得分:1)
根据建议你必须调用performSegue方法:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// not necessary
//rowPressed = indexPath.row
//print ("rowPressed = \(rowPressed) before VC changes")
performSegueWithIdentifier("Your id", sender: indexPath)
//You can set the identifier in the storyboard, by clicking on the segue
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Your id"{
var vc = segue.destinationViewController as! GameVC
vc.toPass = (sender as! IndexPath).row
}
}
答案 2 :(得分:1)
因为在prepareForSegue
之前调用didSelectRowAt
,您还可以从故事板中删除segue,将ctrl从顶部的UITableViewController
的黄色图标拖放到第二个ViewController
,点击segue,为其指定一个标识符,现在您可以拨打performSegue
:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.pressed = indexPath.row
self.performSegue(withIdentifier: "segue identifier", sender: nil)
}