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
相关产品推荐
相关产品推荐

