簡體   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