为啥我的 UICollectionView 无法访问我在 for 循环中创建的数组 - 致命错误:索引超出范围
Posted
技术标签:
【中文标题】为啥我的 UICollectionView 无法访问我在 for 循环中创建的数组 - 致命错误:索引超出范围【英文标题】:Why isn't an array I create in a for loop accessible by my UICollectionView - fatal error: Index out of range为什么我的 UICollectionView 无法访问我在 for 循环中创建的数组 - 致命错误:索引超出范围 【发布时间】:2018-01-28 07:00:50 【问题描述】:我正在尝试使用来自 firebase 的数据填充 UICollectionView,但是当我尝试拉出我的数组 [indexPath.item] 时收到超出范围的错误。
我可以提取我正在寻找的数据(红色和蓝色战斗机),然后将其分配到一个数组中。但看起来在 viewDidLoad 关闭之后,它清除了数组 - 当我尝试使用这些值更新我的 UICollectionView 时,这给了我一个错误。
这是我在 viewDidLoad 之前的变量:
var eventid : String!
var boutsIDArray : [String] = []
var redFightersArray: [String] = []
var blueFightersArray: [String] = []
这是我的 for 循环,它从 firebase 中提取数据并将其分配到我的数组中:
for i in 0..<self.boutsIDArray.count
let bid = self.boutsIDArray[i]
ref.child("Bouts").child(eventid).child(bid).observe(.value, with: (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject]
let redname = dictionary["red fighter"]
let bluename = dictionary["blue fighter"]
self.redFightersArray.append(redname as! String)
self.blueFightersArray.append(bluename as! String)
print(self.redFightersArray)
print(self.blueFightersArray)
)
这是我收到超出范围错误的集合视图:
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return boutsIDArray.count
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell:ResultsCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ResultsCollectionViewCell
cell.redFighterLabel.text = redFightersArray[indexPath.item]
cell.blueFighterLabel.text = blueFightersArray[indexPath.item]
return cell
我是新手,因此欢迎任何关于如何将我的 CollectionView 与我的数组链接的建议或建议。
提前致谢!
【问题讨论】:
我的猜测是您在网络操作完成之前尝试访问redFightersArray
和blueFightersArray
。由于集合视图中的项目数由boutsIDArray
的大小设置,因此您会遇到越界异常。要么从其中一个战斗机阵列驱动您的集合视图,要么更仔细地考虑您的数据应该如何构建。你应该,也许,每回合有一个部分吗?
您应该检查redFightersArray
、blueFightersArray
和boutsIDArray
的计数,我认为在您的情况下它们应该相等,否则这将是崩溃的原因...
感谢您的快速回复。当我在 viewdidload 中打印我的 redFightersArray 和 blueFightersArray 时,它们都返回了 2 个项目。因此,boutsIDArray、redFightersArray 和 blurFightersArray 在视图中都以相同的计数返回确实加载了....我的 boutsIDArray 是从另一个视图控制器传递的,所以它似乎保留了这一点,但没有保留由创建的其他两个数组上的数据进入集合视图后的forloop
我在视图控制器的最底部输入了项目的部分和单元格的数量。会不会跟这有关系??我没有把它们放在正确的地方吗?
为什么不用模型
【参考方案1】:
将您的集合视图 numberOfItemsInSection 更改为依赖于 redFightersArray 或 blueFightersArray
示例:
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return redFightersArray.count
然后在网络操作完成后重新加载你的集合视图
示例:
for i in 0..<self.boutsIDArray.count
let bid = self.boutsIDArray[i]
ref.child("Bouts").child(eventid).child(bid).observe(.value, with: (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject]
let redname = dictionary["red fighter"]
let bluename = dictionary["blue fighter"]
self.redFightersArray.append(redname as! String)
self.blueFightersArray.append(bluename as! String)
print(self.redFightersArray)
print(self.blueFightersArray)
yourCollectionView.reloadData()
)
以上是最简单的方法,但它会在添加新项目时重新加载整个集合视图。所以你可以考虑使用reloadItems(at:...)
【讨论】:
我不敢相信这就是我所缺少的 ??♀️。非常感谢!!以上是关于为啥我的 UICollectionView 无法访问我在 for 循环中创建的数组 - 致命错误:索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 uicollectionview 不随底层 uiscrollview 一起移动?
为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?
为啥我不能从我的 UICollectionView 中删除图像?
为啥我的 UICollectionView 支持方法仅在我的 ViewController 设置为初始视图控制器时调用?