在 tableView didSelectRowAt indexPath iOS 之前准备 segue 调用
prepare for segue call before tableView didSelectRowAt indexPath iOS
我有 3 个 VC - VC1, VC2 & VC3
我正在创建一个 unwind segue,其中 -
- VC1 是目的地
- 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
}
但是从打印值我看到 prepareforSegue 比 didSelectRowAt. 更早被调用因此我没有得到预期的价值做好准备
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
}
}
我有 3 个 VC - VC1, VC2 & VC3
我正在创建一个 unwind segue,其中 -
- VC1 是目的地
- 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
}
但是从打印值我看到 prepareforSegue 比 didSelectRowAt. 更早被调用因此我没有得到预期的价值做好准备
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
}
}