Segue重复加载下一界面问题求助:偶发两次加载原因排查
我之前也碰到过类似的CoreLocation结合Segue跳转的偶发重复问题,大概率是**didUpdateLocations方法被多次触发**导致的!
问题根源分析
CoreLocation的CLLocationManager在获取用户位置时,不会只回调一次didUpdateLocations:比如首次定位时,可能先返回一个精度较低的临时位置,紧接着又返回更精确的坐标;或者设备位置有微小变化时,也会触发该方法。而你把performSegue放在这个方法里,就会导致每次回调都执行一次跳转,从而出现偶发的重复加载情况。
可行的解决方案
这里提供两种最直接的解决思路:
方法一:添加标记位+停止位置更新
定义一个布尔变量来标记是否已经执行过Segue,同时在执行Segue后立刻停止位置更新,避免后续的回调触发重复跳转。示例代码如下:// 定义标记位,初始为false private var hasTriggeredSegue = false func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { // 确保获取到有效位置且未执行过Segue guard let validLocation = locations.last, !hasTriggeredSegue else { return } // 执行你的坐标存储逻辑 storeUserLocation(validLocation) // 标记已执行Segue,停止位置更新,再触发跳转 hasTriggeredSegue = true manager.stopUpdatingLocation() performSegue(withIdentifier: "YourTargetSegueID", sender: self) }方法二:调整Segue触发时机到按钮回调(需处理异步等待)
如果不想在didUpdateLocations里处理跳转,可以把触发逻辑移到getMyLocation按钮的IBAction中,但需要通过Completion Handler或者监听位置获取完成的事件,确保拿到坐标后再执行Segue。不过这种方法相对复杂一些,适合需要持续获取位置的场景。
额外检查点
你可以再确认下:有没有在其他地方(比如按钮的IBAction方法里)也调用了同一个Segue的performSegue(withIdentifier:sender:)?如果有的话,也可能导致重复跳转,但根据你描述的偶发频率,更大概率还是didUpdateLocations多次回调的问题。
内容的提问来源于stack exchange,提问作者matteo94

