Collectionview 中显示多个 Parse.com 行图像?

Posted

技术标签:

【中文标题】Collectionview 中显示多个 Parse.com 行图像?【英文标题】:Multiple Parse.com row images displaying in Collectionview? 【发布时间】:2015-07-28 22:39:06 【问题描述】:

我只有一个类,叫做“Collections”。在那个类中,我有多个列用于“名称”、“位置”、“图像1”、“图像2”、“图像3”和“图像4”。

如果我只处理一个图像和一个表格视图,我不会有任何问题。但是我正在冒险超出我现在所知道的范围,并且似乎无法在任何地方找到任何与 Swift 打交道的示例。我看到它提到使用少量的列文件/图像是可以的(就像我正在做的那样 3-4 个),如果你使用更多来做一个关系(不管那是什么)。 不幸的是,我还没有找到任何关于如何实际下拉图像的示例(如果它们存在的话)。

代码如下,但它所做的只是拉取 image1 图像,因为我也不知道如何在集合视图中获取 image2、image3 和 image4。

...这里删除了一堆不工作的代码...

在此处添加新代码:

这是变量:

class ParseCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UISearchBarDelegate 

var currentObject : PFObject?
var collectionImages: [PFFile]?
var tappedObjectID: String!
var imageObject0: PFFile!
var imageObject1: PFFile!
var imageObject2: PFFile!
var imageObject3: PFFile!
var imageObject4: PFFile!
var imageObject5: PFFile!
var imageArray: [UIImage] = []
var collectionImage0: UIImage!
var collectionImage1: UIImage!
var collectionImage2: UIImage!
var collectionImage3: UIImage!
var collectionImage4: UIImage!
var collectionImage5: UIImage!
var imageView: PFImageView!

这是一段非常难看的代码......我确信这是一个数组的完美工作,但我还不确定如何去做:

    func loadCollectionViewData() 

    // Build a parse query object
    var query = PFQuery(className:"Collections")
    query.whereKey("objectId", equalTo:tappedObjectID)
    query.findObjectsInBackgroundWithBlock(
        (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil 
            println("Successfully retrieved \(objects!.count) records.")

            self.imageArray.removeAll(keepCapacity: true)

            for object in objects! 

                self.imageObject0 = object["image0"] as! PFFile
                self.imageObject0.getDataInBackgroundWithBlock(
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil 
                        self.collectionImage0 = UIImage(data:imageData!)!
                        println("Image0 successfully retrieved")
                        println(self.collectionImage0)


                    

                    self.imageArray.append(self.collectionImage0)
                    self.collectionView.reloadData()
                    println("image0 imageArray: \(self.imageArray)")

                )

                self.imageObject1 = object["image1"] as! PFFile
                self.imageObject1.getDataInBackgroundWithBlock(
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil 
                        self.collectionImage1 = UIImage(data:imageData!)!
                        println("Image1 successfully retrieved")
                        println(self.collectionImage1)


                    

                    self.imageArray.append(self.collectionImage1)
                    self.collectionView.reloadData()
                    println("image1 imageArray: \(self.imageArray)")

                )

                self.imageObject2 = object["image2"] as! PFFile
                self.imageObject2.getDataInBackgroundWithBlock(
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil 
                        self.collectionImage2 = UIImage(data:imageData!)!
                        println("Image2 successfully retrieved")
                        println(self.collectionImage2)


                    

                    self.imageArray.append(self.collectionImage2)
                    self.collectionView.reloadData()
                    println("image0 imageArray: \(self.imageArray)")

                )

                self.imageObject3 = object["image3"] as! PFFile
                self.imageObject3.getDataInBackgroundWithBlock(
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil 
                        self.collectionImage3 = UIImage(data:imageData!)!
                        println("Image3 successfully retrieved")
                        println(self.collectionImage3)


                    

                    self.imageArray.append(self.collectionImage3)
                    self.collectionView.reloadData()
                    println("image3 imageArray: \(self.imageArray)")

                )

                self.imageObject4 = object["image4"] as! PFFile
                self.imageObject4.getDataInBackgroundWithBlock(
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil 
                        self.collectionImage4 = UIImage(data:imageData!)!
                        println("Image4 successfully retrieved")
                        println(self.collectionImage4)


                    

                    self.imageArray.append(self.collectionImage4)
                    self.collectionView.reloadData()
                    println("image4 imageArray: \(self.imageArray)")

                )

                self.imageObject5 = object["image0"] as! PFFile
                self.imageObject5.getDataInBackgroundWithBlock(
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil 
                        self.collectionImage5 = UIImage(data:imageData!)!
                        println("Image0 successfully retrieved")
                        println(self.collectionImage5)


                    

                    self.imageArray.append(self.collectionImage5)
                    self.collectionView.reloadData()
                    println("image5 imageArray: \(self.imageArray)")

                )

            

         else 
            NSLog("Error: %@ %@", error!, error!.userInfo!)
        


    )

        self.collectionView.reloadData()


这是单元格的东西:

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 

    return imageArray.count


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ParseCollectionViewCell

    cell.cellImage.image = UIImage(named: "question")

    cell.cellImage.image = imageArray[indexPath.row]

    return cell

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
    let tappedObject = imageArray[indexPath.row]

    performSegueWithIdentifier("CollectionViewToDetailView", sender: tappedObject)


// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

    var detailObject : PFObject?
    if let imageArray = sender as? PFObject
        detailObject = sender as? PFObject
     else 
        // No cell selected in collectionView
        detailObject = PFObject(className:"Collections")
    

    // Get a handle on the next story board controller and set the currentObject ready for the viewDidLoad method
    var detailScene = segue.destinationViewController as! ParseDetailViewController
    detailScene.detailObject = (detailObject)
    detailScene.currentObject = (currentObject)

由于随机加载,我要么需要弄清楚如何强制图像按特定顺序加载,要么我必须弄清楚当我点击它时哪个图像是哪个,以便我可以正确地将它传递到下一个viewcontroller,即细节视图控制器。

【问题讨论】:

【参考方案1】:

您必须为单元格中的图像创建更多 UIImageViews(或 PFImageViews),然后只需为其余图像重复您对第一个图像的内容(但更改它们的名称以匹配它们在解析时存储的列)

或者,您可能想要实现 PFImageViews 并使用它们的文件属性和 loadInBackground() 方法。

编辑:您可以遍历收到的对象并将图像放入一个新数组中,并将其用于您的集合视图。

代码示例:

var parseOjbect = ["image1":NSData(), "image2":NSData(),"image3":NSData(),"image4":NSData()]

var receivedParseObjects = [parseOjbect]

var photosForCollectionView = [NSData]()

for receivedParseObject in receivedParseObjects 

photosForCollectionView.append(receivedParseObject["image1"]!)
photosForCollectionView.append(receivedParseObject["image2"]!)
photosForCollectionView.append(receivedParseObject["image3"]!)
photosForCollectionView.append(receivedParseObject["image4"]!)

【讨论】:

我不确定我是否理解。我的 UIImageView 设置在我的自定义 UICollectionViewCell 文件中。我想生成一个 2 x 2 网格,每个单元格包含一个图像。当我点击一张图片时,它会推送到一个detailviewcontroller,在那里我可以更改图片。我已经弄清楚了网格,并且已经弄清楚了 push segue。我也很确定我知道如何更改和更新图像。但我不知道如何显示单独的“文件”行并让它们填充网格。我只得到一个 image1 图像。 在您的自定义 UICollectionViewCell 文件中添加更多 UIImageViews 以容纳其他图像文件。 不会将所有图像卡在一个单元格中,而是创建一个由单个和单独的 collectionview 单元格组成的网格,每个单元格都有自己的图像(第一个为 image1,第二个为 image2,等等...)?我只需要每个单元格每个单元格有一个图像,因为我计划点击一个单元格并将其连接到只显示单个图像的详细视图控制器。 知道了,然后您可以创建一个新数组来保存您的图像,然后遍历您收到的解析数据并将每个图像添加到新数组中,然后使用该数组创建您的 uicollectionview 谢谢。我不太确定这段代码的去向,但我会尝试一下并尝试弄清楚。

以上是关于Collectionview 中显示多个 Parse.com 行图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 的 collectionView 中显示每个类别的多个类别?

在 Swift 中分别在单个列中显示多个 CollectionView Cell

一个 ViewController 中的多个 CollectionView

如何在 swift ios 的自定义 collectionView 单元中将字符串值显示到多个标签?

具有多个单元格的 Collectionview 和 diffable 部分

CollectionView 默认项目选择