将数据从 TableView 发送到 DetailView Swift

Posted

技术标签:

【中文标题】将数据从 TableView 发送到 DetailView Swift【英文标题】:Send data from TableView to DetailView Swift 【发布时间】:2015-04-10 10:13:09 【问题描述】:

到目前为止,我正在尝试做一件对我来说最简单、最令人困惑的事情 我想开发自己的 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!

@IBOutlet weak var imgCar: UIImageView!

override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code


override func setSelected(selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state


class DetailViewController: UIViewController 



    @IBOutlet weak var lblDetail: UILabel!

    @IBOutlet weak var imgDetail: UIImageView!

    override func viewDidLoad() 
        super.viewDidLoad()
    

问题是:

如果用户点击 Ferrari 458 ,DetailViewController 中的 lblDetail 会显示: Ferrari 458 is a super car which is able to reach 325 km/h ...... (随心所欲) 并且 imgDetail 将能够显示汽车的图像(无论我们想要什么)

如果用户现在点击布加迪威龙,lblDetail 将向我们展示:布加迪威龙是一款完美的超级运动机器。它是世界上最快的汽车之一......

imgDetail 向我们展示这辆车的图片

所有汽车都一样,具体取决于我们点击了哪一行

我知道工作是围绕第一个 View Controller 中的 prepareForSegue 函数进行的,但我尝试了很多不同的方法来使其成为可能,并且一切正常

我们怎样才能做到这一点???

【问题讨论】:

当我试图将一个字符串传递给另一个视图控制器以便将来按其名称存储它时,我也遇到了同样的问题。我偶然发现了这篇文章,它清楚地解释了它。 codingexplorer.com/segue-swift-view-controllers 【参考方案1】:

这是给你的例子:

var valueToPass:String!

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 
    println("You selected cell #\(indexPath.row)!")

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow!
    let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell

    valueToPass = currentCell.textLabel.text
    performSegueWithIdentifier("yourSegueIdentifer", sender: self)


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

    if (segue.identifier == "yourSegueIdentifer") 
        // initialize new view controller and cast it as your view controller
        var viewController = segue.destinationViewController as AnotherViewController
        // your new view controller should have property that will store passed value
        viewController.passedValue = valueToPass
    

但不要忘记在您的DetailViewController 中创建一个passedValue 变量。

这只是将数据从一个 viewController 传递到另一个 viewController 的示例,您可以根据需要使用此示例传递数据。

有关更多信息,请参阅此链接。

Passing values between ViewControllers based on list selection in Swift

Use didSelectRowAtIndexPath or prepareForSegue method for UITableView?

Swift: Pass UITableViewCell label to new ViewController

https://teamtreehouse.com/forum/help-swift-segue-with-variables-is-not-working

也许这会对你有所帮助。

Swift 3.0

var valueToPass:String!
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    print("You selected cell #\(indexPath.row)!")

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow!
    let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell

    valueToPass = currentCell.textLabel?.text
    performSegue(withIdentifier: "yourSegueIdentifer", sender: self)


func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

    if (segue.identifier == "yourSegueIdentifer") 
        // initialize new view controller and cast it as your view controller
        var viewController = segue.destination as! AnotherViewController
        // your new view controller should have property that will store passed value
        viewController.passedValue = valueToPass
    

【讨论】:

嗨 Dharmesh Kheni,首先非常感谢您的好意 当然,您写的所有内容都可以帮助我更多地理解它,但仍然没有按照我正在寻找的方式运行 现在应用程序知道选择了哪一行,但是我需要知道如何更改 lblDetail 和 imgDetail S 对不起...我认为我们需要一个 if 语句或类似的东西...但是在哪里?如何? =S 我是初学者,请接受我的道歉 只需将变量创建到 DetailViewController 中,该变量可以在从 segue 传递值时保存值并将该值分配给该变量,然后您可以将值显示到 DetailViewController 中。 我已经在 DetailViewController Dharmesh 中分配了变量,但我不知道如何告诉标签:好的,现在如果点击了 Ferrari 行,则显示该文本,或者现在显示其他文本?这如何转化为代码?再次感谢您 记住我是个初学者。我只需要最后一步,但我需要看到它是用代码编写的【参考方案2】:

这可能是另一种解决方案,在 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]
        
    

【讨论】:

【参考方案3】:

如果您从原型单元(在界面构建器中)拖动一个 segue 到您的下一个 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
    

而且您也不需要didSelectRowAtIndexPath() 中的performSegueWithIdentifier(),也不需要这个表格视图方法。

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

var valueToPass: String!

override func viewDidLoad() 
    super.viewDidLoad()
    yourLabel.text = valueToPass

它从情节提要初始化之后设置标签的值很重要。也就是说,不能直接在之前的 View Controller 的prepareForSegue() 中设置标签,所以需要用valueToPass 传递。

【讨论】:

这是最好的答案【参考方案4】:

很简单,我在上面的答案中添加了一条语句。 要在详细视图标签中获取选定的汽车名称,

lblDetail.text = 传递值

您可以在详细视图的 viewDidLoad() 函数中添加此行代码。 passValue 包含用户选择的汽车名称(在 prepareForSegue 中分配),然后您可以分配给您的 detailView 标签。

希望对你有帮助!

【讨论】:

以上是关于将数据从 TableView 发送到 DetailView Swift的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 TableView 传递到 ViewController

如何从属于 UITableView 中的模型数组对象的数组中向 tableView 显示数据?

如何将 TableView 中的选定行(JSON)发送到另一个视图控制器?

如何将标签中的数据从表视图行操作发送到视图控制器?

将数据从 tableview 传递到另一个 tableview

将数据从 Tableview 传递到 Tableview 详细信息