为了账号安全,请及时绑定邮箱和手机立即绑定

将数据从TableView发送到DetailView Swift

将数据从TableView发送到DetailView Swift

PIPIONE 2019-12-03 09:45:14
直到现在我想开发自己的App之前,我都试图为我做一件最简单,更令人困惑的事情,为了做到这一点,我需要能够根据行用户点击的方式传递一些信息(这是Swift语言)我们有一个RootViewController(表视图)和DetailViewController(带有1个标签和1个图像) 在此处输入图片说明(我们的观点)这是代码:@IBOutlet weak var tableView: UITableView!var vehicleData : [String] = ["Ferrari 458" , "Lamborghini Murcielago" , "Bugatti Veyron", "Mercedes Benz Biome"]override func viewDidLoad() {    super.viewDidLoad()    // Do any additional setup after loading the view, typically from a nib.    var nib = UINib(nibName: "TableViewCell", bundle: nil)    tableView.registerNib(nib, forCellReuseIdentifier: "cell")}func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {    return vehicleData.count}func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    let cell:TableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as TableViewCell    cell.lblCarName.text = vehicleData[indexPath.row]    cell.imgCar.image = UIImage(named: vehicleData[indexPath.row])    return cell   }func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {    performSegueWithIdentifier("DetailView", sender: self)} override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {    if(segue.identifier == "DetailView") {        var vc = segue.destinationViewController as DetailViewController    }}func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {    return 100}自定义TableViewCell类(具有带有单元格的xib文件)class TableViewCell: UITableViewCell {@IBOutlet weak var lblCarName: UILabel!问题是:如果用户单击Ferrari 458,则DetailViewController中的lblDetail将显示:Ferrari 458是一辆超级跑车,能够达到325 km / h……(无论我们想要什么),imgDetail可以显示图像(无论如何)我们想要的)如果用户单击布加迪威龙,则lblDetail向我们显示:布加迪威龙是一款完美的超级运动机。它是世界上最快的汽车之一。imgDetail向我们展示这辆车的图像所有汽车都一样,这取决于我们点击了哪一行我知道工作是围绕第一个View Controller中的prepareForSegue函数进行的,但是我正在尝试许多不同的方法来使其成为可能,并且一切正常我们如何做到这一点???
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

这可能是另一种解决方案,在didSelectRowAtIndexPath方法中没有太多代码。请注意,虽然它看起来更干净,并且我们不需要额外的变量valueToPass,但这可能不是最佳实践,因为performSegue方法中的sender参数应该是发起segue(或nil)的实际对象。


// MARK: UITableViewDelegate methods


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.deselectRow(at: indexPath, animated: true)


    performSegue(withIdentifier: "goToSecondVC", sender: indexPath)

}


// MARK: UIViewController methods


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

    if segue.identifier == "goToSecondVC" {    

        if segue.destination.isKind(of: CarDetailsController.self) {

            let secondVC = segue.destination as! CarDetailsController


            let indexPath = sender as! IndexPath


            secondVC.passedValue = carsArray[indexPath.row]

        }

    }

}


查看完整回答
反对 回复 2019-12-03
?
莫回无

TA贡献1865条经验 获得超7个赞

如果将Segue从原型单元(在Interface Builder中)拖到下一个View Controller并将其Segue标识符设置为“ Your Segue Identifier”,则也可以使用以下快捷方式进行操作:


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

    if segue.identifier == "Your Segue Identifier" {

        let cell = sender as! YourCustomCell

        let vc = segue.destination as! PushedViewController

        vc.valueToPass = cell.textLabel?.text // or custom label

    }

}

而且你也不需要performSegueWithIdentifier()的didSelectRowAtIndexPath(),也没有这个表视图方法。


在PushedViewController.swift(下一个视图控制器)中:


var valueToPass: String!


override func viewDidLoad() {

    super.viewDidLoad()

    yourLabel.text = valueToPass

}

从情节提要板初始化标签后,设置标签的值很重要。这意味着您不能prepareForSegue()直接在先前的View Controller中设置标签,因此需要通过进行传递valueToPass。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 573 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信