代码之家  ›  专栏  ›  技术社区  ›  Eduardo Navarrete

如何将UITableView数据(UIImage和字符串)提取到另一个ViewController

  •  -1
  • Eduardo Navarrete  · 技术社区  · 6 年前

    我想将TableView中包含的存储数据传递给另一个ViewController。我的customCell有一个UIImage和一个字符串。 当用户按下单元格时,我想显示一个带有UIImage的“detail view controller”,以及一个包含所选单元格信息的标签。

    这是我的代码:

    import UIKit
    
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet weak var dataTableView: UITableView!
    
    var myList = [dataList]()
    
    var textToBeSent: String = ""
    
    var selectedImage: UIImage?
    var selectedLabel: String?
    
    //Load Items To List
    
    func loaditems(){
        let item1 = dataList(photoList: UIImage.self(), itemDescription: "Descripcion Aqui")
        let item2 = dataList(photoList: UIImage.self(), itemDescription: "Aqui tmb")
    
        myList += [item1,item2]
    }
    
    //var list = ["Documento 1", "Documento 2", "Documento 3"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        if let savedData = loadSavedItems(){
            myList += savedData
        } else {
    
        loaditems()
        }
    
    
        //dataTableView.register(UITableViewCell.self, forCellReuseIdentifier: "reusablecell")
    
    
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return myList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "prototype", for: indexPath) as! PrototypeCell
    
        let itemsinCell = myList[indexPath.row]
    
        cell.imageItem.image = itemsinCell.photoList
        cell.itemDescription.text = String(itemsinCell.itemDescription)
    
        return cell
    }
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete{
            myList.remove(at: indexPath.row)
            dataTableView.reloadData()
        }
    
        saveToSavedData()
    }
    

    这是我想传递某个单元格数据的函数。 数据来自使用aDecoder NSCoder存储在“数据列表”中的Swift文件。

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    
        print("Row \(indexPath.row) selected")
        selectedImage! = myList[indexPath.row].photoList
        selectedLabel! = myList[indexPath.row].itemdescription
        performSegue(withIdentifier: "selectedRowSegue", sender: myList[indexPath.row])
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if(segue.identifier == "selectedRowSegue"){
            let chosenRowViewController = segue.destination as! chosenRowViewController
            chosenRowViewController.image3 = selectedImage?.photoList
            chosenRowViewController.label3 = selectedLabel?.itemDescription
        }
    }
    

    展开一段,以便用上一段的数据填充单元格 视图控制器:

    //Unwinde Segue
    @IBAction func unWindlToList(sender: UIStoryboardSegue){
        if let sourceViewController = sender.source as? ProcessViewController, let item = sourceViewController.item{
            let newIndexPath = IndexPath(row: myList.count, section: 0)
            myList.append(item)
            dataTableView.insertRows(at: [newIndexPath], with: .automatic)
        }
        saveToSavedData()
    }
    //Archive Data
    func saveToSavedData(){
        NSKeyedArchiver.archiveRootObject(myList, toFile: (dataList.fileFolder?.path)!)
    }
    //Unarchive Data
    func loadSavedItems() -> [dataList]?{
        return NSKeyedUnarchiver.unarchiveObject(withFile: (dataList.fileFolder?.path)!) as? [dataList]
    }
    
    }
    
    class PrototypeCell: UITableViewCell {
    
        @IBOutlet weak var itemDescription: UILabel!
    
        @IBOutlet weak var imageItem: UIImageView!
    
    }
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   iParesh    6 年前

    只需更换 prepare(for segue: UIStoryboardSegue, sender: Any?) 具有以下代码的函数

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if(segue.identifier == "selectedRowSegue"), let list = sender as? dataList {
                let chosenRowViewController = segue.destination as! chosenRowViewController
                chosenRowViewController.image3 = list.photoList
                chosenRowViewController.label3 = list.itemDescription 
            }
        }
    
        2
  •  0
  •   Lance Samaria    6 年前

    有几件事很突出。

    1个- var myList = [dataList]() 数据列表是 Class ,类应大写。应该是这样的 var myList = [DataList]()

    2-您将其作为类属性,但它在您发布的代码中没有任何地方使用,因此为什么要添加它?它的用途是什么? var textToBeSent: String = ""

    3-您有以下2个类属性变量

    var selectedImage: UIImage?
    var selectedLabel: String?
    

    保存数据的步骤 [myList] 但您真的不需要它们,因为您可以从 [我的列表] 使用 dot notation 在…内 prepareForSegue (阅读PrepareForsgue中注释掉的代码)。

    4-在准备阶段 let chosenRowViewController = segue.destination as! chosenRowViewController .ChosenRowViewController是一个类,它应该大写,如下所示:

    let chosenRowViewController = segue.destination as! ChosenRowViewController // it's capitalized after the as!
    

    这是稍微整理一下的代码。

    @IBOutlet weak var dataTableView: UITableView!
    
    var myList = [DataList]()
    
    func loaditems(){
        let item1 = dataList(photoList: UIImage.self(), itemDescription: "Descripcion Aqui")
        let item2 = dataList(photoList: UIImage.self(), itemDescription: "Aqui tmb")
    
        myList.append(item1)
        myList.append(item2)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // everything you already have inside here...
    }
    
    // your tableView datasource methods...
    

    5-使用后 准备工作表 你不需要 didSelectRowAt indexPath

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if(segue.identifier == "selectedRowSegue"){
    
            // get the indexPath for the selectedRow
            let indexPath = tableView.indexPathForSelectedRow
    
            let chosenRowViewController = segue.destination as! ChosenRowViewController
            chosenRowViewController.image3 = myList[indexPath!.row].photoList // use dot notation to access the photoList property
            chosenRowViewController.label3 = myList[indexPath!.row].itemDescription  // use dot notation to access the itemDescription property
        }
    }
    
        3
  •  0
  •   Dhaval Dobariya    6 年前

    你犯了一个错误 didSelectRowAt ,呼叫时 performSegue 您必须通过控制器 sender ,在您的情况下,它是您当前的 UIVIewController ,所以你必须写 self 作为发送方控制器。因此,正确的方法如下所示:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    
        print("Row \(indexPath.row) selected")
        selectedImage! = myList[indexPath.row].photoList
        selectedLabel! = myList[indexPath.row]
        performSegue(withIdentifier: "selectedRowSegue", sender: self)
    }