从其他视图控制器运行函数后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循环语句打印出0~100之间的偶数