当我跳转到设置页面并在弹出的对话框中单击取消时,它会自动返回到主页.我怎样才能避免这个问题呢?


import SwiftUI

struct ContentView: View {
    
    @State private var settingActive: Bool = false
    
    var body: some View {
        NavigationView {
            TabView {
                VStack {
                    
                    NavigationLink(destination: SettingView(), isActive: $settingActive) {
                        EmptyView()
                    }

                    Button {
                        settingActive.toggle()
                    } label: {
                        Text("Setting")
                    }
                }
                .padding()
            }
        }
    }
}

struct SettingView: View {
    
    @State private var logoutActive: Bool = false
    
    var body: some View {
        VStack {
            Button {
                logoutActive.toggle()
            } label: {
                Text("Logout")
            }
            .confirmationDialog("Logout", isPresented: $logoutActive) {
                Button("Logout", role: .destructive) {
                    
                }
            }
        }
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


推荐答案

这似乎是在NavigationView内部使用TabView的问题.

您可以通过将TabView移动到您的顶级对象(它实际上应该在的位置)来解决这个问题,或者用新的NavigationStack替换NavigationView.

下面的实现还删除了不推荐使用的NavigationLink方法:

enum Router {
    case settings
}

struct ContentView: View {
    
    @State private var path = NavigationPath()
    
    var body: some View {
        TabView {
            NavigationStack(path: $path) {
                VStack {
                                        
                    Button {
                        path.append(Router.settings)
                    } label: {
                        Text("Setting")
                    }
                }
                .navigationDestination(for: Router.self) { router in
                    switch router {
                    case .settings:
                        SettingView(path: $path)
                    }
                }
                .padding()
            }
        }
    }
}

struct SettingView: View {
    
    @Binding var path: NavigationPath
    @State private var logoutActive: Bool = false
    
    var body: some View {
        VStack {
            Button {
                logoutActive = true
            } label: {
                Text("Logout")
            }
            .confirmationDialog("Logout", isPresented: $logoutActive) {
                Button("Logout", role: .destructive) {
                    
                }
            }
        }
    }
}

Swift相关问答推荐

多个提取来计算核心数据中的记录

启用完成并发判断以及如何解决警告(续)

如何避免使用DispatchSemaphores时线程爆炸?

如何在SWIFT中解码Instagram Backup中的字符串?

SwiftUI正在初始化不带状态变量的绑定变量

从后台线程获取@发布属性的值(不更改它)是正确的吗?

SwiftUI同心圆,通过逐渐出现来显示进度

正在接收具有不完整数据错误的URL请求

将NavigationSplitView更改为NavigationStack

如何在SwiftUI中做出适当的曲线?

如何避免切换视图递归onChange调用SwiftUI

在表单中对齐文本框

如何删除快速处理消息

UUID 哈希值是不确定的吗?

使用列表的下一项更新相同的视图

您可以在运行时访问 Picker 元素并更改它们的 colored颜色 吗

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

如何让 SwiftUI 中的文本在旋转框架的同时侧向显示?

Xcode swift ui 错误KeyPathComparator仅在 macOS 12.0 或更高版本中可用

通过单击表格视图中的单元格打开新的视图控制器 - Swift iOS