由于索引超出范围,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]'