繁体   English   中英

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

[英]how to pass the value from table view cell to view controller

我有一个包含许多单元格的表格视图。每个单元格都有一张图像和一个标签。而我需要的是,当用户按下任何一个单元格时,都必须转到详细信息viewcontroller。并且我需要在其中显示相应的图像和标签名称我的详细信息视图控制器。

我已经完成了所有的任务。但是在我的细节视图控制器中,我只有一个图像和标签。现在当我从表格视图中选择任何单元格时,如何显示图像和标签名称?

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
    }






}

用这样的东西改变你的选择

像这样在ViewContrller中声明一个全球索引indexPath

var selectedIndexPath: NSIndexPath = NSIndexPath()

像这样更改您的didselect

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加载中添加标签

像这样更改detailVC的viewdidload

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

希望对您有所帮助。

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

您可以在其中为store indexpath声明一个变量。

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]) 
    }

你快到了! 这行代码:performSegueWithIdentifier(“ DetailView”,发送者: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!

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]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM