【问题标题】:Swift: UICollectionView & UIImage fatal error: Array index out of rangeSwift:UICollectionView & UIImage 致命错误:数组索引超出范围
【发布时间】:2015-07-19 16:33:17
【问题描述】:

您好,我是 swift 新手,需要一些帮助,谢谢。该程序运行一次,尝试再次运行它然后它崩溃了。调试时这些项目在数组中,但是当我尝试显示图像时出现致命错误。

    // Get Brands
    func getBrand () {

        // Create PFQuery
        var query:PFQuery = PFQuery(className: "BrandInfo")

        // Call findobjects
        query.findObjectsInBackgroundWithBlock {
            (objects:[AnyObject]?, error: NSError?) -> Void in

            // refresh array
            self.brands = [String]()
            self.pics = [UIImage]()

            // loop through array
            for brandObject in objects! {

            // get PFObjects
            let brandName:String? = (brandObject as! PFObject)["Name"] as? String

                if brandName != nil {
                    self.brands.append(brandName!)

                }

            let brandPicture = brandObject["Image"] as! PFFile
                brandPicture.getDataInBackgroundWithBlock({ (imageData:NSData?, error:NSError?) -> Void in

                    if(error == nil){

                    let brandImage = UIImage(data: imageData!)
                        self.pics.append(brandImage)

                        println(self.pics.count)
                    }
                })

    }
        // Refresh CollectionView
        self.collectionView.reloadData()

}

}

// Setting up collection view
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.brands.count
}

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

    let cell:collectionViewCell = self.collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! collectionViewCell

    // Get elements
    let picToDisplay:UIImage? = pics[indexPath.row]  // this is the error line
    let dataToDisplay:String = brands[indexPath.row]

    let imageView:UIImageView? = cell.viewWithTag(2) as? UIImageView


    // Set labels
    cell.brandImage.image = picToDisplay
    cell.brandLabel.text = dataToDisplay


    return cell

}

/////////////////////////////

结构品牌集合 {

    var brandText:[String] = [String]()
    var brandImage:[UIImage?] = [UIImage]()

}

【问题讨论】:

    标签: swift parse-platform uiimage


    【解决方案1】:

    您有brands.count 项目,并且您需要brand.count 图像。但是您使用的是不同的数组pics,如果它的元素少于brands,它将失败。查看您的代码,有几种可能会发生这种情况。

    这是糟糕的设计。您应该有一个封装了您需要的所有信息的数据数组。每个图像都应该连接到它的对象(品牌),而不是保存在其他数组中。

    【讨论】:

    • 感谢您的回复。我什至不知道该怎么做,例如?
    • 欢迎来到 Stackoverflow。抱歉,但您必须编写自己的代码;-)。给你的品牌类一个属性image 并将图像存储在那里。
    • 我指的是 youtube 视频或其他东西,但无论如何谢谢你
    • 如何将其更改为结构并保存数据。我更新了代码
    • 你可以用变量名创建一个名为 Brand 的类:String?和图像:UIImage?并创建一个包含 Brand 的数组(您的自定义类的实例)。然后从中加载您的collectionView。这是实现 Mundi 建议的一种方式。
    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多