在 tableView didSelectRowAt indexPath iOS 之前准备 segue 调用

prepare for segue call before tableView didSelectRowAt indexPath iOS

我有 3 个 VC - VC1, VC2 & VC3

我正在创建一个 unwind segue,其中 -

  1. VC1 是目的地
  2. VC2 是来源

所以,我在 VC1 -

中添加了标记功能
@IBAction func unwindToHomeViewController(_ sender: UIStoryboardSegue) {}

并且在 VC2 中我创建了两个变量 -

var userSelectedPlacesLatitude: Double = 0
var userSelectedPlacesLongitude: Double = 0

将在 tableView 中更新 -

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.userSelectedPlacesLatitude = suggestedPlacenames[indexPath.row].geometry.coordinates[1]
    self.userSelectedPlacesLongitude = suggestedPlacenames[indexPath.row].geometry.coordinates[0]
    print("In didSelectRowAt", userSelectedPlacesLatitude, userSelectedPlacesLongitude)
}

然后准备segue -

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destinationVC = segue.destination as! VC1
    print("In Segue preperation",userSelectedPlacesLatitude, userSelectedPlacesLongitude)
    destinationVC.userSelectedPlacesLatitude = self.userSelectedPlacesLatitude
    destinationVC.userSelectedPlacesLongitude = self.userSelectedPlacesLongitude
    destinationVC.reloadWeatherDataStatus = true
}

但是从打印值我看到 prepareforSeguedidSelectRowAt. 更早被调用因此我没有得到预期的价值做好准备

In Segue preperation 0.0 0.0
In didSelectRowAt 49.3227937844972 31.3202829593814

因此 0.0 0.0 一直传递到 VC1。我该如何解决这个问题?

试试下面的代码,如果有效请告诉我 -

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let destinationVC = VC1()
    destinationVC.userSelectedPlacesLatitude = suggestedPlacenames[indexPath.row].geometry.coordinates[1]
    destinationVC.userSelectedPlacesLongitude = suggestedPlacenames[indexPath.row].geometry.coordinates[0]
    destinationVC.reloadWeatherDataStatus = true
    destinationVC.performSegueWithIdentifier("DestinationSegueName", sender: self)
}

添加对此答案的修改,因为有些人可能在创建 VC 实例时遇到问题 -

第 1 步 - 创建一个名为“SegueToDestinationVc”的手动转场,从源 (VC1) 到目标 (VC2) 视图控制器,并将此代码写入源视图控制器 -

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "SegueToDestinationVc") {
        let vc = segue.destination as! VC2
        vc.dataToPass = someData
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    someData = placeName[indexPath.row]
}

第 2 步 - 在目标视图控制器 (VC2) 中有一个名为“dataToPass”的 public 属性 并使用它。

乐于助人,谢谢。

快乐编码

如果您需要任何其他帮助,请告诉我。

您遇到的问题是由于在情节提要中的 table 视图单元直接链接了展开转场。一旦用户点击该行,unwind segue 就会触发。之后调用 didSelectRow(at:) 函数,但为时已晚;您已经回到 VC1。

虽然您可以使用 prepareForSegue 将数据 发送到 VC1,但更好的方法是使用 sender 传递给 unwindToHomeViewController 到让 VC1 从 VC2.

中获取数据

这意味着 VC2 不需要知道关于 VC1 的任何信息。您也可以去掉 reloadWeatherDataStatus 属性 并简单地在 unwind 函数中重新加载天气数据状态。

你应该:

  • 在 VC2
  • 中从 table 视图行中删除 segue
  • 在您的情节提要中,按住 Ctrl 键从 VC2 顶部的“视图控制器”图标拖动到 VC2 顶部的“退出”图标,然后 select unwindToHomeViewController
  • Select 新创建的 unwind segue 并给它一个标识符,比如 unwindToVC1
  • 在 VC2 中你有
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.userSelectedPlacesLatitude = suggestedPlacenames[indexPath.row].geometry.coordinates[1]
    self.userSelectedPlacesLongitude = suggestedPlacenames[indexPath.row].geometry.coordinates[0]
    self.performSegue(withIdentifier:"unwindToVC1", sender: self)
}
  • 从 VC2

    中删除 prepare(for segue: sender:)
  • VC1

@IBAction func unwindToHomeViewController(_ sender: UIStoryboardSegue) {
    if let sourceVC = sender.source as? VC2 {
        self.userSelectedPlacesLatitude = sourceVC.userSelectedPlacesLatitude
        self.userSelectedPlacesLongitude = sourceVC.userSelectedPlacesLongitude
        // Do whatever is required to reload the data based on the new location
    }
}