SwiftUI confirmationDialog三级页面点击后返回上页问题求助
问题原因与解决方案
这是SwiftUI里导航栏按钮绑定confirmationDialog后的典型交互冲突问题。当你把对话框直接附加在导航栏的按钮上时,三级页面的导航层级逻辑会和对话框的按钮点击事件产生冲突,系统会错误地将对话框按钮的点击判定为导航返回操作,导致页面被弹出。
解决方法
把confirmationDialog从导航栏按钮的修饰符中剥离,转而附加到页面的根容器视图(比如VStack、List这类承载页面内容的视图)上,导航栏按钮只负责切换对话框的显示状态即可。
修改后的三级页面代码示例:
struct ThirdLevelView: View { @State private var opinionSheet = false @State private var opinionNavigationLink = false @State private var opinionAlert = false var moreBtn: some View { Button(action: { opinionSheet.toggle() }) { Image(systemName: "ellipsis") .resizable() .scaledToFit() .frame(width: 14) .foregroundColor(.black) .rotationEffect(.degrees(-90)) } } var body: some View { // 替换为你实际的页面根容器视图 VStack { Text("三级页面内容") } .navigationBarItems(trailing: moreBtn) // 将confirmationDialog移到根视图的修饰符中 .confirmationDialog(Text("Opinion"), isPresented: $opinionSheet, titleVisibility: .hidden) { Button("Revise") { opinionNavigationLink = true } Button("Delete", role: .destructive) { opinionAlert = true } Button("Cancel", role: .cancel) { } } // 保留跳转修改页面的逻辑 .navigationDestination(isPresented: $opinionNavigationLink) { ReviseView() // 替换为你的修改页面视图 } .alert("确认删除?", isPresented: $opinionAlert) { Button("取消", role: .cancel) {} Button("删除", role: .destructive) { // 执行删除逻辑 } } } }
调整后,对话框的交互逻辑和导航栏操作不再冲突,点击对话框按钮时就不会触发页面返回了。
内容的提问来源于stack exchange,提问作者JungP
相关产品推荐
相关产品推荐

