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

SwiftUI + Combine实现位置授权状态变更时跳转至下一页面

解决方案:权限授予后自动跳转页面

嘿,这个需求很常见,你的代码只差一步就能实现啦!问题在于你现在只在按钮点击瞬间检查了权限状态,但用户授予权限是异步操作——当用户在弹窗里点“允许”后,你的代码没有监听这个状态变化,所以不会自动触发跳转。

我们只需要添加对locationManager.locationStatus的监听,当它变成授权状态时自动激活导航链接就行,具体修改如下:

struct MyLocationScreen: View {
    @ObservedObject var locationManager = LocationManager()
    @State var isShowLinkTarget :Bool = false
    
    var body: some View {
        NavigationView{
            ZStack{
                Button(action: {
                    let locStatus = self.locationManager.locationStatus
                    if locStatus == .authorizedWhenInUse || locStatus == .authorizedAlways {
                        self.isShowLinkTarget = true
                    } else {
                        self.locationManager.requestAuthorization()
                        self.locationManager.startUpdate()
                    }
                }) {
                    Text("Share Location")
                }
                // MARK: - 新增:监听位置权限状态变化
                .onReceive(locationManager.$locationStatus) { newStatus in
                    if newStatus == .authorizedWhenInUse || newStatus == .authorizedAlways {
                        self.isShowLinkTarget = true
                    }
                }
                NavigationLink(destination: NextScreen(), isActive: $isShowLinkTarget) {
                    EmptyView() // 用EmptyView替代空Text更规范
                }
            }
        }
    }
}

关键说明:

  • locationManager.locationStatus是@Published属性,我们用onReceive(_:perform:)来订阅它的变化事件。
  • 当用户在权限弹窗中授予权限后,locationStatus会自动更新为.authorizedWhenInUse或.authorizedAlways,这时onReceive里的闭包就会执行,把isShowLinkTarget设为true,自动触发导航跳转。
  • 另外把原来的空Text改成EmptyView(),这是SwiftUI中隐藏导航链接的标准写法,更符合规范。

这样修改后,不管是用户点击按钮时已经授权,还是授权后状态变化,都能正确触发页面跳转啦!

内容的提问来源于stack exchange,提问作者Himanshu Ahuja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:02:38