跨控制器调用GameViewController方法触发for循环数组越界问题
问题原因及修复方案
IBOutlet为nil的核心原因
该问题的常见触发原因是:PopupViewController中持有的gameVC并非当前正在屏幕上显示、已经完成视图加载的GameViewController实例,而是新创建的未加载视图的实例。
iOS中ViewController的IBOutlet属性仅会在视图完成加载(viewDidLoad执行完成)后,由storyboard/xib自动连接赋值。如果gameVC是你直接通过初始化方法新建、或者新从storyboard实例化的对象,没有被push/present到视图层级中,就不会触发视图加载流程,所有IBOutlet属性都会保持默认的nil状态,对应的imageArray、imageArray2也为空数组,此时执行0...6的固定下标遍历就会直接触发越界错误。
其他可能的触发原因
- 调用时机不合理:当前代码在触发dismiss后立刻执行
removingCard方法,未等待dismiss动画完成、GameViewController回到活跃状态,极端场景下也可能出现视图属性未就绪的问题。 - 遍历逻辑不严谨:硬编码
0...6的遍历范围,一旦数组元素数量因异常场景发生变化,就会直接触发越界。
具体修复步骤
- 修正实例引用逻辑
检查弹出PopupViewController时的传值代码,确保你将当前正在显示的GameViewController实例赋值给了PopupViewController的gameVC属性,而非新建GameViewController实例。 - 调整方法调用时机
将removingCard的调用放到dismiss的完成回调中,确保动画结束、GameVC状态就绪后再执行逻辑,同时添加可选绑定避免强制解包崩溃:
@IBAction func removePressed(_ sender: UIButton) { dismiss(animated: true) { [weak self] in guard let self = self, let targetIndex = self.index else { return } self.gameVC.removingCard(indexToRemove: targetIndex) } }
- 优化数组遍历逻辑
将硬编码的遍历范围替换为数组实际长度,避免异常场景下的越界:
// 替换原有 for i in 0...6 逻辑 for i in 0..<imagesAll.count { imagesAll[i].setImage(nil, for: .normal) } // 若确定按钮数量固定为7,可添加断言提前定位问题 assert(imagesAll.count == 7, "按钮数组元素数量异常,请检查IBOutlet连接")
内容的提问来源于stack exchange,提问作者computerJee
相关产品推荐
相关产品推荐

