如何将值从表视图单元格传递给视图控制器

时间:2016-06-09 06:58:00

标签: ios iphone swift uitableview

我有一个包含许多单元格的表视图。每个单元格都有一个图像和一个标签。我需要的是当用户按任何单元格时它必须转到详细视图控制器。我需要显示相应的图像和我的详细视图控制器中的标签名称。如何做到这一点。

我已完成所有segue.But在我的详细视图控制器中我有一个图像和标签。现在如何显示图像和标签名称 - 当我从表格视图中选择任何单元格?

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet var tableView: UITableView!
    var valueToPass:String!
var selectedIndexPath: NSIndexPath = NSIndexPath()

    var tableData: [String] = ["Christ Redeemer", "Great Wall of China", "Machu Picchu","Petra","Pyramid at Chichén Itzá","Roman Colosseum","Taj Mahal"]
    var arrImageName: [String] = ["ChristRedeemer", "GreatWallOfChina", "MachuPicchu","Petra","PyramidChichenItza","RomanColosseum","TajMahal"]

var tableRate: [String] = ["$120", "$100", "$222","$1000","$500","$900","$2000"]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

    }

    func numberOfSectionsInTableView(tableView: UITableView) ->Int
    {
    return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         return self.tableData.count;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell:CustomTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("CustomTableViewCell") as! CustomTableViewCell

        cell.imageVW.image = UIImage(named:self.arrImageName[indexPath.row])

        cell.lblName.text = self.tableData[indexPath.row]
        cell.rateName.text = self.tableRate[indexPath.row]

        return cell
    }


    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
      self.selectedIndexPath = indexPath

        performSegueWithIdentifier("DetailView", sender: indexPath)
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
        let indexPath = self.selectedIndexPath

        if (segue.identifier == "DetailView") {
            var viewController = segue.destinationViewController as! DetailVC
            viewController.data = UIImagePNGRepresentation(UIImage(named:self.arrImageName[indexPath.row])!)!
            //viewController.name =  self.tableData[[indexPath.row]]
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

这是我的detailvc.swift

import UIKit

class DetailVC: UIViewController {


    var data: NSData = NSData()
    var name: String = String()



    @IBOutlet weak var ImgView: UIImageView!


    override func viewDidLoad() {
        super.viewDidLoad()
        self.ImgView.image = UIImage(data: data)
        //self.detailLabelNamee.text = name
    }






}

5 个答案:

答案 0 :(得分:3)

使用类似的内容更改你的选择

在ViewContrller中声明一个gloabal indexPath,如下所示

var selectedIndexPath: NSIndexPath = NSIndexPath()

像这样改变你的选择

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.selectedIndexPath = indexPath
    self.performSegueWithIdentifier("DetailView", sender: self)
}

现在在prepareForSegue方法中添加此

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
    let indexPath = self.selectedIndexPath

    if (segue.identifier == "DetailView") {
        var viewController = segue.destinationViewController as! DetailVC
        viewController.data = UIImagePNGRepresentation(UIImage(named:self.arrImageName[indexPath.row]))
        viewController.name =  self.tableData[indexPath.row]
    }
}

现在在DetailVC中添加两个全局标识符,如下所示

var data: NSData = NSData()
var name: String = String()

现在将此数据和字符串分配给imageview并在viewdid load中标记

像这样更改detailVC的viewdidload

 override func viewDidLoad() {
    super.viewDidLoad()
    self.ImgView.image = UIImage(data: data)
    self.detailLabelNamee.text = name 
 }

跳这将有所帮助。

答案 1 :(得分:1)

didSelectRowAtIndexPath中,您可以执行segue,在prepareForSegue中,您可以使用self.tableView.indexPathForSelectedRow获取indexPath。当然它会返回一个可选项,您必须先检查它是否安全。我认为这是最简单的方法。

答案 2 :(得分:0)

您可以在其中声明存储索引路径的变量。

var selectedItemIndex = Int()

单击 didselectowatndexaPath

中的行下方的单元格写入
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

        selectedItemIndex = indexPath.row
        self .performSegueWithIdentifier(“YourViewController”, sender: nil)
    }


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

        let yourVC = segue.destinationViewController as! YourViewController


        yourVC.text = tableData[selectedItemIndex]
        yourVC.image = UIImage(named:arrImageName[selectedItemIndex]) 
    }

答案 3 :(得分:0)

你快到了!这条线: performSegueWithIdentifier(“DetailView”,sender:self)

需要改变。 'self'将当前视图控制器的引用传递给prepareForSegue方法。如果将“self”更改为“indexPath”,那么prepareForSegue将在“sender”对象中看到单元格索引路径,并从中获取所需内容。

您可以执行以下操作:

if (segue.identifier == "yourSegueIdentifer") {
    var viewController = segue.destinationViewController as! DetailVC
    let indexPath = sender as! NSIndexPath
    viewController.passedImageName = self.arrImageName[indexPath.row]
    viewController.passedData = self.tableData[indexPath.row]
    viewController.passedRate = self.tableRate[indexPath.row]

并在DetailVC中:

class DetailVC: UIViewController {
    var passedImageName:String!
    var passedData:String!
    var passedRate:String!

答案 4 :(得分:0)

didSelectRowAtIndexPath 中,您可以获取所选行的索引路径,然后您可以执行Segue并在发件人中传递索引路径。 在prepareForSeque中,从索引路径,您可以获取image,tableData和tableRate。您可以将其传递给详细视图。像下面的东西

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    performSegueWithIdentifier("DetailView", sender: indexPath)
}



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
    let selectedIndexPath = sender as! NSIndexPath

    if (segue.identifier == "DetailView") {
        var viewController = segue.destinationViewController as! DetailVC

viewController . setValues(tableData:tableData[selectedIndexPath] , rate: tableRate[selectedIndexPath] , imageName:arrImageName[selectedIndexPath])
}


class DetailVC: UIViewController {

    var imageName:String!
    var tableData:String!
    var tableRate:String!



func setValues(tableData:String , rate:String , imageName:String){
imageName = tableData
tableRate = rate
imageName = imageName

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
    let selectedIndexPath = sender as! NSIndexPath

    if (segue.identifier == "DetailView") {
        var viewController = segue.destinationViewController as! DetailVC

viewController.imageName = self.arrImageName[selectedIndexPath.row]
viewController.tableData = self.tableData[selectedIndexPath.row]
viewController.tableRate = self.tableRate[selectedIndexPath.row]
}