SwiftUI自定义返回按钮无法关闭Sheet弹窗问题排查
问题原因与修复方案
核心问题
弹窗触发状态是固定值,无法动态更新
你用.constant(!creatives.isEmpty)作为sheet的isPresented参数,这个值是静态的,不会随creatives变化或手动操作改变,所以即使返回按钮执行操作,弹窗也不会响应关闭指令。返回按钮的
dismiss()作用对象错误
当前代码里的presentationMode.wrappedValue.dismiss()是用来关闭当前的NavigationView页面,而非弹出的sheet弹窗。sheet弹窗的关闭需要通过控制它的绑定状态来实现。
修复步骤
1. 将弹窗触发状态改为可绑定的变量
在弹窗所在的视图中定义一个@State变量控制sheet显示:
@State private var isSheetPresented = false
然后修改sheet调用逻辑,替换.constant为绑定变量,并在打开弹窗的时机更新这个变量:
Section { Button("Reset Form") { resetForm() } Button("Request Data") { getCreatives() // 获取数据后根据状态打开弹窗 isSheetPresented = !creatives.isEmpty } } .navigationBarTitle("Dummy page", displayMode: .inline) .sheet(isPresented: $isSheetPresented) { Screen(creatives: self.screen) }
2. 让自定义返回按钮控制弹窗关闭
根据系统版本选择适配方案:
方案一:iOS 15+ 推荐(用新的环境变量)
在Screen视图里直接调用环境变量关闭弹窗:
// Screen视图内部 @Environment(\.dismiss) private var dismiss var body: some View { NavigationView { // [SOME STUFF HERE] } .navigationBarTitle("Creatives Screen", displayMode: .inline) .navigationBarBackButtonHidden(true) .navigationBarItems(leading: Button(action: { dismiss() // 直接关闭当前sheet弹窗 print("Button pressed") }) { HStack { Image(systemName: "arrow.left.circle") Text("Back") } } ) }
方案二:兼容iOS 14及以下(传递绑定变量)
把控制弹窗的绑定变量传给Screen视图,通过修改变量关闭弹窗:
// 弹窗所在视图的sheet传递绑定 .sheet(isPresented: $isSheetPresented) { Screen(creatives: self.screen, isSheetPresented: $isSheetPresented) } // Screen视图内部 @Binding var isSheetPresented: Bool var body: some View { NavigationView { // [SOME STUFF HERE] } .navigationBarTitle("Creatives Screen", displayMode: .inline) .navigationBarBackButtonHidden(true) .navigationBarItems(leading: Button(action: { isSheetPresented = false // 修改绑定变量关闭弹窗 print("Button pressed") }) { HStack { Image(systemName: "arrow.left.circle") Text("Back") } } ) }
内容的提问来源于stack exchange,提问作者dosytres
相关产品推荐
相关产品推荐

