从其他视图控制器运行函数后for循环出索引

Posted

技术标签:

【中文标题】从其他视图控制器运行函数后for循环出索引【英文标题】:for loop out of index after running function from other view controller 【发布时间】:2022-01-12 07:44:36 【问题描述】:

我有一个 PopupViewController,它从我的 GameViewController 中调用一个函数,到目前为止它一直运行良好。


//from my game view controller

for i in 0...6 
            imagesAll[i].setImage(nil, for: .normal)
        
        
        if cardIndex != 0 
            for i in 0...cardIndex - 1 
                imagesAll[i].setImage(cards.map($0.image)[i], for: .normal)
            
        

我已经对该代码进行了数百次测试,一切正常。这是我的 GameViewController 的 reset() 函数的一部分。在我的 PopupViewController 中,我使用参数调用函数 gameVC.removingCard()

//in my popup view controller

@IBAction func removePressed(_ sender: UIButton) 
        dismiss(animated: true, completion: nil)
        gameVC.removingCard(indexToRemove: index!)
        
    

其中包含带参数的函数resetImages()

    func removingCard(indexToRemove: Int) 
        
        ...
        ...
        ...
        
        
        resetImages(cards: myDeck)
        ...
        ...
        ...

    

当它被调用时,现在我得到了我在数周的测试代码中没有得到的索引错误。从其他 VC 调用此代码时,我是否做错了什么?我知道这并没有太多可以使用的代码,但也许我缺少一些明显的东西。



        let parentsOne = cards.suffix(2)
        var imagesAll: [UIButton] = []
        if isPlayerOneTurn 
            imagesAll = imageArray
         else 
            imagesAll = imageArray2
        
        
        
        
        var cardIndex = cards.count - 2
        for i in 0...6           //this line: Out Of Index Error
            imagesAll[i].setImage(nil, for: .normal)
        
        
        if cardIndex != 0 
            for i in 0...cardIndex - 1 
                imagesAll[i].setImage(cards.map($0.image)[i], for: .normal)
            
        
        
        if gameManager.pileCards.count == 0 
            drawingCard.setImage(nil, for: .normal)
         else 
            drawingCard.setImage(gameManager.pileCards.last?.image, for: .normal)
        
        
        if gameManager.secondPile.count == 0 
            secondDraw.setImage(nil, for: .normal)
         else 
            secondDraw.setImage(gameManager.secondPile.last?.image, for: .normal)
        
        
        if gameManager.studentPile.count == 0 
            studentTableCard.setImage(nil, for: .normal)
         else 
            studentTableCard.setImage(gameManager.studentPile.last?.image, for: .normal)
        
        
        if isPlayerOneTurn 
            onePParent1.setImage(parentsOne.map($0.image).first!, for: .normal)
            onePParent2.setImage(parentsOne.map($0.image).last!, for: .normal)
         else 
            twoPParent1.setImage(parentsOne.map($0.image).first!, for: .normal)
            twoPParent2.setImage(parentsOne.map($0.image).last!, for: .normal)
        
    

编辑

我没有删除索引,该函数只是为了在数组的索引位置标记某个卡片而命名。

编辑

因此,经过更多探索,我发现当从另一个视图控制器调用该函数时,我的 imagesAll 数组中的按钮未到达,它们被声明为 nil。为什么我的 IBOutlets 被其他视图控制器声明为 nil?

【问题讨论】:

删除索引后需要中断循环 或者如果您同时删除多个索引,则首先反转要删除的索引数组并在最后一次删除索引后中断循环 【参考方案1】:

你必须在关闭你的 ViewController 之前调用这个 gameVC.removingCard(indexToRemove: index!)。

【讨论】:

这是评论而非答案 我最初尝试过,它没有工作,但我现在无论如何都会在关闭之前编写函数 你如何获得索引你能分享你的代码的完整sn-p吗? 我编辑了代码以包含导致崩溃的整个函数,具体行已注明 在我不断尝试的过程中,我注意到我的按钮数组是 nil 而不是我之前声明的 7 个 IBoutlets。当从其他视图控制器调用函数时,我的按钮是否为零?

以上是关于从其他视图控制器运行函数后for循环出索引的主要内容,如果未能解决你的问题,请参考以下文章

带有for循环的MVC视图仅返回最后一项

如何从堆栈中弹出视图控制器而不导航到它们

编写一个控制台应用程序,用for循环语句打印出0~100之间的偶数

如何在python里面for循环中放了一个定时函数,当定时函数运行时跳过本次循环,执行那个循环

Api 调用 Laravel 8 后如何从控制器返回视图?

从任何其他选项卡的视图控制器中弹出第二个选项卡的根视图(默认)