You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨控制器调用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的遍历范围,一旦数组元素数量因异常场景发生变化,就会直接触发越界。

具体修复步骤

  1. 修正实例引用逻辑
    检查弹出PopupViewController时的传值代码,确保你将当前正在显示的GameViewController实例赋值给了PopupViewController的gameVC属性,而非新建GameViewController实例。
  2. 调整方法调用时机
    将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)
    }
}
  1. 优化数组遍历逻辑
    将硬编码的遍历范围替换为数组实际长度,避免异常场景下的越界:
// 替换原有 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:01