为啥我的 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 与我的数组链接的建议或建议。

提前致谢!

【问题讨论】:

我的猜测是您在网络操作完成之前尝试访问redFightersArrayblueFightersArray。由于集合视图中的项目数由boutsIDArray 的大小设置,因此您会遇到越界异常。要么从其中一个战斗机阵列驱动您的集合视图,要么更仔细地考虑您的数据应该如何构建。你应该,也许,每回合有一个部分吗? 您应该检查redFightersArrayblueFightersArrayboutsIDArray 的计数,我认为在您的情况下它们应该相等,否则这将是崩溃的原因... 感谢您的快速回复。当我在 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 大纲不起作用?

为啥我的 uicollectionview 不随底层 uiscrollview 一起移动?

为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?

为啥我不能从我的 UICollectionView 中删除图像?

为啥我的 UICollectionView 支持方法仅在我的 ViewController 设置为初始视图控制器时调用?

为啥 UICollectionView didSelect 方法不起作用?