SwiftUI Binding未更新导致登录成功后popover弹窗无法关闭问题排查
问题原因
- 你自定义的
Binding<Bool>的set闭包为空,SwiftUI需要通过双向绑定同步状态变更,空的set实现会导致状态更新无法同步到视图响应链,无法触发弹窗的退场逻辑 - 弹窗显示条件同时依赖
session.isAnon和isSignInClicked两个状态,登录成功后仅修改了isAnon,没有重置本地isSignInClicked状态,SwiftUI无法正确感知到绑定值的变化,所以不会主动关闭弹窗
修复方案
方案1:补全Binding的set逻辑
直接修改popover的绑定参数,补全set闭包同步修改isSignInClicked状态即可:
.popover(isPresented: Binding( get: { session.isAnon && isSignInClicked }, set: { isSignInClicked = $0 } )) { LogInView() }
该方案下绑定值的变更会同步到本地状态,自动触发弹窗关闭。
方案2:监听登录状态重置触发变量
在视图上添加onChange修饰符,监听session.isAnon的变化,登录成功后自动重置弹窗触发状态:
var body: some View { Group { // 外层包裹Group方便加修饰符 if session.isAnon { Button("Please Sign in to view your activities") { isSignInClicked.toggle() } .popover(isPresented: $isSignInClicked) { LogInView() } } else { Text("Logged In!") } } .onChange(of: session.isAnon) { isAnon in if !isAnon { isSignInClicked = false } } }
该方案逻辑更清晰,不需要自定义复杂的绑定条件。
内容的提问来源于stack exchange,提问作者user43964
相关产品推荐
相关产品推荐

