Swift / XCode - 为什么我不能在按下tableViewCell时将数据传递给下一个视图控制器?

时间:2017-10-26 20:37:45

标签: ios swift uitableview uiviewcontroller

道歉,如果这已经在其他地方得到解答了 - 我花了最后两个小时尝试使用类似的建议做不同的事情,但我仍然无法解决它!

基本上,我有一个带有自定义单元格的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值。我该如何解决这个问题?

非常感谢提前!

3 个答案:

答案 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)
}