【问题标题】:SwiftUI - How can I dismiss a view to root and then push a second view immediately afterwards?SwiftUI - 如何将视图关闭到根目录,然后立即推送第二个视图?
【发布时间】:2021-01-23 09:10:53
【问题描述】:

在 SwiftUI 中找不到与此问题相关的任何内容。

我目前有三个视图,RootView、DetailView1 和 DetailView2。 RootView 将具有一个按钮来推送和显示 DetailView1,在 DetailView1 内部将有一个 NavigationLink 将 DetailView1 关闭到 RootView 并推送 DetailView2。

struct DetailView1: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    var body: some View {
        VStack {
            NavigationLink(destination: DetailView2()) {
                Text("Tap to dismiss DetailView and show DetailView2")
                    .onTapGesture {
                        self.presentationMode.wrappedValue.dismiss()
                    }
            }
        }
    }
}

struct DetailView2: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    var body: some View {
        Button(
            "This is DetailView2",
            action: { self.presentationMode.wrappedValue.dismiss() }
        )
    }
}

struct RootView: View {
    var body: some View {
        VStack {
            NavigationLink(destination: DetailView1())
            { Text("This is root view. Tap to go to DetailView") }
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            RootView()
        }
    }
}

预期行为: 用户在 DetailView1 中按下 NavigationLink,视图被解除到 RootView 并且 DetailView2 被向上推。

当前行为: 用户在DetailView1中按下NavigationLink,视图被解除到RootView,DetailView2没有被推送。

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    您可以通过传递第二个视图的活动状态来做到这一点。并更改@State 值。类似于 UIKit 中的完成块的概念。

    详细视图1

    struct DetailView1: View {
        @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
        
        @Binding var isActiveDetails2: Bool //<-- Here
    
        var body: some View {
            VStack {
                Button("Tap to dismiss DetailView and show DetailView2") {
                    isActiveDetails2 = true //<-- Here
                }
            }
        }
    }
    

    根视图

    struct RootView: View {
        @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
        @State private var isActiveDetails2: Bool = false
        
        var body: some View {
            VStack {
                NavigationLink(destination: DetailView1(isActiveDetails2: $isActiveDetails2))
                { Text("This is root view. Tap to go to DetailView") }
                
                
                NavigationLink(destination: DetailView2(), isActive: $isActiveDetails2) { //<-- Here
                    EmptyView()
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2014-09-16
      • 2010-10-31
      • 1970-01-01
      • 2012-08-02
      • 2021-02-18
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      相关资源
      最近更新 更多