将正确的图像传递给tableviewcell的问题

时间:2017-10-23 09:17:36

标签: ios swift uiviewcontroller uicollectionview swift-structs

这是我的结构...

struct ProductImage {
   let id : String
   let url : URL
   let isDefault : Bool
}

struct Product {
    let name : String
    let id : String
    var images = [ProductImage]()

    init(name : String, id: String) {
        self.name = name
        self.id = id
    }

    mutating func add(image: ProductImage) {
        images.append(image)
    }
}

现在我在collectionview上加载了图片,点击按钮后,我想将此图片传递给tableviewcellcollectionview确实有几个带有name和id的标签,这些标签已成功传递......但是如何传递图像我无法弄清楚。以下是点击卖出按钮到目前为止发生的事情......

func SellBtnTapped(_ sender: UIButton) {

   let indexPath = collectionView?.indexPath(for: ((sender.superview?.superview) as! RecipeCollectionViewCell))

   let myVC = storyboard?.instantiateViewController(withIdentifier: "productSellIdentifier") as! sellTableViewController
   let productObject = productData1[(indexPath?.row)!]

   if selectedItems == nil {
       //selectedItems is an array which will hold all struct items.
       selectedItems = [Product(name:productObject.name, id: productObject.id)]
   } else {
       selectedItems?.append(productObject)
   }

   myVC.arrProduct = selectedItems
   navigationController?.pushViewController(myVC, animated: true)
}

这就是我在tableviewcell中分配图像和其他数据的方式。这是cellForRow的代码..(从中加载单元格的tableview)。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
             let cell: sellTableViewCell = tableView.dequeueReusableCell(withIdentifier: "sellProductIdentifier") as! sellTableViewCell

    //cell.prdImgView?.image =.... by doing this, the images are displayed in the tableviewcell in the same order as they are displayed in the collectionview cells irresoective of which cell was clicked. i.e clicking on btn on 1st collection view item shows the image on that collection view item on the tableviewcell.And when I click on the btn on the 4th collectionview item the image shown on the tableview cell will be that of the 2nd collectionview item...     
             cell.prdImgView?.image = self.appDelegate.commonArrayForURLImages[indexPath.row]                              

             let product = arrProduct?[indexPath.row]
             cell.produvtNameLabel.text = product?.name
             cell.rateTextField.text = product?.theRate

             return cell
        }

这是数组(传递给tableview单元格)获取图像的方式......

var theProduct = Product(name: name, id: id, theRate: rate, quantity: qty, sku: skuCode, prdCateg: prodCat, prodDescr: description)
if let images1 = anItem["product_images"] as? [[String:String]] {
    for image in images1 {
        guard let imageId = image["id"],
            let url1 = image["image"],
            let isDefault = image["is_default"] else { continue }
        let productImage = ProductImage(id: imageId, url: URL(string: url1)!, isDefault: isDefault == "1")
        theProduct.add(image: productImage)
        self.productData1.append(theProduct)
        self.imgData.append(productImage)
        let url = URL(string: url1)
        if let data = try? Data(contentsOf: url!) {
            let img = UIImage(data: data)
            print(img!)
            self.arrayOfURLImages.append(img!)
        }

        self.appDelegate.commonArrayForURLImages = self.arrayOfURLImages
    }
}

1 个答案:

答案 0 :(得分:2)

Structs为您提供成员明智的初始化程序,因此在大多数情况下您不需要自己的一个。在您的代码中,您的产品初始化程序仅包含名称和ID,而不是productImage数组,您似乎是有一个单独的函数来保存这些数据,我认为这里不需要。所以我所做的只是为[ProductImages]创建了一个数组类型,并坚持使用默认的初始化。

import Foundation

struct ProductImage {
    let id        : String?
    let url       : String? // Keep this string
    let isDefault : Bool?
}

struct Product {
    let name   : String?
    let id.    : String?
    var images : [ProductImage]?
}

ControllerClass(收集视图获取初始数据) - :

在你的控制器类中,我创建了2个数组 - :

1)保存图像数据。

2)保存整个产品信息的数据。

为了保存数据,我现在只传递常数值。在viewDidLoad中,我为每个对象调用了初始化程序 - :

1)保存图像对象数据。

2)ProductObject数据。

3)将两个对象附​​加到适当的数组。

import UIKit
class MyViewController: UIViewController {

    @IBOutlet weak var mainCollectionView: UICollectionView!

    // ARRAY OBJECT OF TYPE PRODUCT AND PRODUCT IMAGE

    var imageData   = [ProductImage]()
    var productData = [Product]()


    //viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        modelDataForCollectionView()
        }

    func modelDataForCollectionView(){

        // GET IMAGE DATA

        let imageObject = ProductImage(id: "1", url: "your url", isDefault: true)
        imageData.append(imageObject)

        // MODEL FOR PRODUCTS

        let productObject = Product(name: "", id: "", images: imageData)
        productData.append(productObject)
    }

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

}

// MyViewController extending collection view

extension MyViewController :UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
    //numberOfItemsInSection
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
        return productData.count
    }


    //dequeueReusableCell
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionCell
        cell.sendButton.addTarget(self, action: #selector(sendDataToTable), for: UIControlEvents.touchUpInside)
        return cell
    }

    //numberOfSections

    func numberOfSections(in collectionView: UICollectionView) -> Int{
        return 1
    }

    // sizeForItemAt for each row
    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
        return CGSize(width: view.frame.width, height: 200)
    }

    func sendDataToTable(sender:UIButton){
        let index = mainCollectionView.indexPath(for: sender.superview?.superview as! CollectionCell)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let Controller = storyboard.instantiateViewController(withIdentifier: "tableData") as! ViewController1
        Controller.dataForTableView = productData[(index?.row)!].images
        self.navigationController?.pushViewController(Controller, animated: true)
    }

}

现在,当您点击button中的UICollectionViewCell时,获取抽头索引,并从Product数组中读取该索引中的产品对象。之后,您可以轻松传递所需数据到表格视图(第二课)。

第二个控制器类 - :

 import UIKit

    class ViewController1: UIViewController {

// ARRAY TO HOLD IMAGE DATA FOR TAPPED COLLECTION CELL

        var dataForTableView:[ProductImage]?
        var name            : String?
        var id              : String?

        @IBOutlet weak var secondTable: UITableView!

        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.

            // CHECK FOR DATA

            print(dataForTableView?[0].url as Any) // Optional("your url")
        }

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

    }

    extension ViewController1 : UITableViewDelegate,UITableViewDataSource{
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
            return 1
        }


        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell1") as! testingCell2
            return cell
        }

        // Number of sections in table

        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }// Default is 1 if not implemented

        public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
            return 50
        }

    }

在第二课中获得图像URL和任何其他所需信息后,您可以轻松地将其呈现在桌面上。要获取图片,请api call服务器。我希望能帮助你。

解析代码 - :

var imageUrl:String?
var imageId:String?
var isDefaults:String?
var productId:String?
var productIdTitle:String?
var productIdImageWithPath:String?

//MARK : Call Back Delegate Methods

    func apiSuccessResponse(_ response: Dictionary<String, AnyObject>) {

        print(response)
        if let actualStyleData = response["Productdata"]  as? [Dictionary<String, AnyObject>]{

            for object in actualStyleData{

                if let id = object["product_id"] as? String{
                    productId = id
                }else{
                    productId = ""
                }
                if let title = object["product_name"] as? String{
                    productIdTitle = title
                }

                if let imageDetails = object["product_images"] as? [Dictionary<String, AnyObject>]{
                    for details in imageDetails{
                        if let id = details["id"] as? String{
                            imageId = id
                        }
                        if let url = details["image"] as? String{
                            imageUrl = url
                        }
                        if let isDefault = details["is_default"] as? String{
                           isDefaults = isDefault
                        }
                        let saveImageObject = ProductImage(id: imageId, url: imageUrl, isDefault: isDefaults)
                        imageData.append(saveImageObject)
                    }
                }
                        let saveProductObject = Product(name: productIdTitle, id: productId, images: imageData)
                        productData.append(saveProductObject)
            }
        }
    }