【问题标题】:how to pass the value from table view cell to view controller如何将值从表视图单元格传递到视图控制器
【发布时间】:2016-06-09 18:31:31
【问题描述】:

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

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

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
    }






}

【问题讨论】:

    标签: ios iphone swift uitableview


    【解决方案1】:

    用类似的东西改变你的选择

    像这样在 ViewContrller 中声明一个全局索引路径

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

    像这样改变detailVC的viewdidload

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

    这会有所帮助。

    【讨论】:

    • 我收到错误,即 `Instance member 'data' cannot be used on type 'DetailVC' `
    • 但是如何在我的详细视图控制器中分配图像、标签名称。因为当我选择任何单元格时,我需要在我的下一个详细视图控制器中显示该特定单元格图像和名称。对吗?? ..所以只有我做了 iboutlet 图像,标签到我的细节视图控制器。现在我做了你的解决方案。但它只是创建一个变量。我如何在我的细节视图控制器中分配图像,标签名称??
    • 你现在在DetailVC中得到图片和名字了吗?
    • 我的应用程序崩溃`无法将类型“SimpleTable.CustomTableViewCell”(0x10c9c1918)的值转换为“NSIndexPath”(0x10d1cc438)。`在这一行中`让indexPath = sender as! NSIndexPath`
    • 像这样在 UItableview 的 didselect 方法中传递 indexPath。 performSegueWithIdentifier("DetailView", sender: indexPath)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在您的 didSelectRowAtIndexPath 中,您可以获得所选行的索引路径,然后您可以执行Segue 并将索引路径传递给发件人。 在 prepareForSeque 中,从 index path 可以得到 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]
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          你快到了!该行: 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!
          

          【讨论】:

          • 但是如何在我的详细视图控制器中分配图像、标签名称。因为当我选择任何单元格时,我需要在我的下一个详细视图控制器中显示该特定单元格图像和名称。对吗?? ..所以只有我为图像做了iboutlet,标签到我的细节视图控制器。现在我做了你的解决方案。但它只是创建一个变量。我如何在我的细节视图控制器中分配图像,标签名称??
          • 我在这行let indexPath = sender as! NSIndexPath下收到此错误崩溃Could not cast value of type 'SimpleTable.CustomTableViewCell' (0x106060908) to 'NSIndexPath' (0x10686b438).
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多