由于索引超出范围,uitableviewcell 滚动中的 uicollectionview 将崩溃

Posted

技术标签:

【中文标题】由于索引超出范围,uitableviewcell 滚动中的 uicollectionview 将崩溃【英文标题】:uicollectionview inside uitableviewcell scroll will crash due to Index out of range 【发布时间】:2016-11-07 08:30:49 【问题描述】:

我在 UITableViewCell from this tutorial 中学习了 UICollectionView。

只有当所有集合视图都具有相同的numberOfItemsInSection 时它才能完美运行,因此它可以滚动并且不会导致索引超出范围错误,但是如果集合视图单元格numberOfItemsInSection 不同,当我滚动时集合视图由于索引超出范围而崩溃。

我找到了原因,当我滚动tableview时,collection view单元格索引路径根据底部的更新,但是我滚动的collection view是顶部的所以它不记得numberOfItemsInSection,所以它会由于索引超出范围而崩溃。

ps:它是可滚动的,但只有当那个表格单元格在底部时,因为它的numberOfItemsInSection对应那个单元格,不会导致Index out of range

这是我的 CollectionView 的numberOfItemsInSection,我实际上有两个集合视图,但我认为这不是问题

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

        var numberOfItemsInSection: Int = 0

        if collectionView == self.collectionview_categorymenu 
            let categories = self.json_menucategory["menu_categories"].arrayValue
            numberOfItemsInSection = categories.count
         else 
            let menuitems = self.json_menucategory["menu_items"].arrayValue
            let item_data = menuitems[self.itemimages_index].dictionaryValue
            let menu_item_images = item_data["menu_item_images"]?.arrayValue
            numberOfItemsInSection = (menu_item_images?.count)!
            print(numberOfItemsInSection)
        

        return numberOfItemsInSection
    

这是我的 CollectionView 的cellForItemAt indexPath

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        if collectionView == self.collectionview_categorymenu 

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryMenuCell", for: indexPath) as! CategoryMenuCell

            return cell
         else 

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ItemImagesCell", for: indexPath) as! ItemImagesCell

            let menuitems = self.json_menucategory["menu_items"].arrayValue

            let item_data = menuitems[self.itemimages_index].dictionaryValue

            let menu_item_images = item_data["menu_item_images"]?.arrayValue


            print(menu_item_images!)
            let itemimage_data = menu_item_images?[indexPath.item].dictionaryValue
            print("===\(indexPath.item)===")

            let itemimage_path = itemimage_data?["image"]?.stringValue
            let itemimage_detail = itemimage_data?["detail"]?.stringValue


            if let itemimage = cell.imageview_itemimage 
                let image_url = itemimage_path?.decodeUrl()
                URLSession.shared.dataTask(with: NSURL(string: image_url!) as! URL, completionHandler:  (data, response, error) -> Void in

                    if error != nil 
                        print("error")
                        return
                    
                    DispatchQueue.main.async(execute:  () -> Void
                        in

                        itemimage.image = UIImage(data: data!)!
                    )
                ).resume()
            

            if let description = cell.textview_description 
                description.text = itemimage_detail
            

            if let view = cell.view_description 
                view.isHidden = true
            

            return cell
        

    

【问题讨论】:

我上传了我的 numberOfItemsInSection,请检查。谢谢 我之前遇到过这个问题。您还可以发布您的 tableview 委托功能吗?在我的情况下,我没有在表格视图单元格内为集合视图设置数据源和委托属性。 【参考方案1】:

问题可能是您每次为 numberOfItemsInSection 返回相同的数字您想要做的是返回每个数组中的项目数。根据您发送的链接,他们这样做:

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

    return model[collectionView.tag].count

另一种可能是你在 cellForItemAtIndexPath 时返回了错误的数组,请检查你是否正确使用了 tag 属性

所以他们得到模型中每个数组的计数。如果没有看到您的任何代码,很难真正看到您的错误来自哪里。

【讨论】:

我打印 numberOfItemsInSection 和它不一样,当我滚动表格视图和最低的表格单元格显示时,它将刷新并覆盖最后一个的 numberOfItemsInSection。例如,我滚动的表格单元格有 3 个项目的集合视图,但是当我滚动 tableview 最低单元格时只有 1 个集合视图项目,并且当我滚动它时显示索引超出范围。但是当那个 3items 单元格是最低的单元格时,它可以成功滚动。 我发布了 numberOfItemsInSection 部分。 self.itemimages_index 是我从 tableview 单元获得的索引 你也应该发布 cellForItemAtIndexPath 老实说,我不明白你的错误是什么,也许尝试只用一个collectionview来调试它,然后看看它是否有效。您的错误可能即将到来,因为由于某种原因 numberOfItemsInSection 返回的 int 大于数组的大小。也许检查错误发生在哪个索引并将其与您的数组大小进行比较

以上是关于由于索引超出范围,uitableviewcell 滚动中的 uicollectionview 将崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSRangeException - 超出范围的索引 (2008) (1)

由于索引超出范围,无法设置列标题文本

防止 cellForRowatIndexPath 将索引传递给超出其范围的数组

由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 0 超出范围(必须小于 0)。”迅速

由于未捕获的异常“NSRangeException”而终止应用程序。 [__NSArrayM objectAtIndex:]:索引 33 超出范围 [0 .. 32]'

附件视图超出 UITableViewCell 的可见范围