将 tableViewCell 中的数据传递给另一个 VC 失败

Posted

技术标签:

【中文标题】将 tableViewCell 中的数据传递给另一个 VC 失败【英文标题】:pass data in tableViewCell to another VC failed 【发布时间】:2017-02-25 11:19:45 【问题描述】:

我知道这是一个经常被问到的问题,但我做了一些研究,但没有一个解决方案有效。

这是我的带有表格视图的控制器

class MainPage: UIViewController, UITableViewDelegate, UITableViewDataSource, YoubikeManagerDelegate 
@IBOutlet weak var tableView: UITableView!

let mainPageCell = MainPageCell()
let mapPage = MapViewController()

var stations: [Station] = []
override func viewDidLoad() 
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
     
override func viewDidAppear(_ animated: Bool) 

func numberOfSections(in tableView: UITableView) -> Int 
    return 1


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "infoCell") as! MainPageCell
    cell.stationNameLabel.text = stations[indexPath.row].name
    cell.stationLocationLabel.text = stations[indexPath.row].address
    cell.numberOfRemainingBikeLabel.text = stations[indexPath.row].numberOfRemainingBikes
    cell.printer = stations[indexPath.row].name
    cell.mapBtn.tag = indexPath.row
    cell.mapBtn.addTarget(self, action: #selector(moveToMapPage), for: .touchUpInside)
    return cell

func moveToMapPage(sender: UIButton) 
    self.performSegue(withIdentifier: "toMap", sender: self)
    let nameToPass = stations[sender.tag].name
    mapPage.stationName = nameToPass

在我的 tableView 单元格中有一个 UIButton

class MainPageCell: UITableViewCell 
var printer: String!
let mapPage = MapViewController()
@IBOutlet weak var stationNameLabel: UILabel!
@IBOutlet weak var mapBtn: UIButton!
@IBOutlet weak var stationLocationLabel: UILabel!
@IBOutlet weak var numberOfRemainingBikeLabel: UILabel!

override func awakeFromNib() 
    super.awakeFromNib()
    mapBtn.addTarget(self, action: #selector(mapBtnTapped), for: .touchUpInside)


func mapBtnTapped (sender: UIButton) 
        print (printer)



这是我的另一个 vc

class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate 
@IBOutlet weak var mapView: MKMapView!

var stationName: String = ""

override func viewDidLoad() 
    super.viewDidLoad()
    self.title = stationName

我将详细说明我现在在这里面临的问题! 我想做的是当我点击 tableView 单元格中的按钮时,我想去 MapViewController 并将这个 vc 的标题设置为“站名”在同一个单元格中。

所以在带有 tableView 的 VC 中,在 cellforRowAt 函数中我调用了 addTarget。 带moveToMapPage函数

但是当我点击按钮并转到 MapView VC 时,stationName 仍然为零

我不知道出了什么问题, 任何提示表示赞赏

【问题讨论】:

【参考方案1】:

mapPage 不是您要导航到的实例,因此您在不相关的控制器上设置变量。

如果你想获得新控制器的链接,你需要使用prepare(for segue...

override func prepare(for segue: UIStoryboardSegue, sender: Any?)

    // if you have multiple segues, you can set up different actions for each
    if segue.identifier == "segueToMap"
    
        let mapPage : MapViewController = segue.destination as! MapViewController

        let mapPage : MapViewController = segue.destination as! MapViewController
        mapPage.stationName = nameToPass
        mapPage.delegate = self // if required
        

【讨论】:

嗨罗素感谢您的回答!似乎我误解了导航的东西【参考方案2】:

使用导航控制器

 let vc = self.storyboard?.instantiateViewController(withIdentifier:"toMap") as! toMapViewController
 vc.stationNam = stations[sender.tag].name
self.navigationController?.pushViewController(vc, animated: true)

【讨论】:

以上是关于将 tableViewCell 中的数据传递给另一个 VC 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将计时器中的数据传递给新的 ViewController (Swift 3)

将表单选择的数据传递给 laravel7 中的控制器,返回 null

jQuery 将 Ajax 调用中的数据传递给 MVC 操作方法

如何将片段中的 ListView 对象的数据传递给 Activity?

如何将解析器中的数据传递给函数

R:是不是可以使用 paste0 函数(或一些类似的函数)将存储在对象中的数据传递给新对象?