【问题标题】:SwiftUI - How to auto push 2th-DetailView when 1st-DetailView goback to MasterView using navigationViewSwiftUI - 如何在第一个细节视图使用导航视图返回 MasterView 时自动推送第二个细节视图
【发布时间】:2019-12-03 03:07:35
【问题描述】:

我是新手

我的 xcode 版本是 11.2.1,swift 是 5.1.2


当我在 MasterView 中使用 NavigationView 时,我有两个 DetailViews

我想在第一个DetailView关闭的时候自动进入第二个DetailView


这是我的方法,但失败了。

每当我进入第二个DetailView时,

它会立即自动回到MasterView

https://i.stack.imgur.com/9voJA.gif

这是我的代码

struct MasterView: View {
    @State var tag: Int? = nil
    var body: some View {
        NavigationView{
            VStack{
                NavigationLink(destination: DetailView1(tag: self.$tag), tag: 1, selection: self.$tag) {
                    EmptyView()
                }
                NavigationLink(destination: DetailView2(tag: self.$tag), tag: 2, selection: self.$tag) {
                    EmptyView()
                }

                Button(action: {
                    self.tag = 1
                }) {
                    Text("press here to enter DetailView1")
                }
            }
        }

    }
}

struct DetailView1: View {
    @Binding var tag: Int?
    var body: some View {

        VStack{
            Text("DetailView 1")
        }
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(leading:
            Button(action: {
                self.tag = 2
            }) {
                HStack {
                    Image(systemName: "arrow.left.circle")
                    Text("Go Back")
                }
        })
    }
}

struct DetailView2: View {
    @Binding var tag: Int?
    var body: some View {

        VStack{
            Text("DetailView 2 2 2 2 2 2 2")
        }
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(leading:
            Button(action: {
                self.tag = nil  // never execute
            }) {
                HStack {
                    Image(systemName: "arrow.left.circle")
                    Text("Go Back")
                }
        })
    }
}

我发现当第一个 DetailView 关闭时,“tag”变量会自动设置为“nil”

但我不知道为什么

请帮帮我,谢谢

对不起,我的英语很差

【问题讨论】:

    标签: swift xcode swiftui navigationview navigationlink


    【解决方案1】:

    试试下面的代码。 (请在真机上测试)

    MasterView

    struct MasterView: View {
        @State var tag1: Int? = nil
        @State var tag2: Int? = nil
        var body: some View {
            NavigationView{
                VStack{
                    NavigationLink(destination: DetailView1(tag: self.$tag2), tag: 1, selection: self.$tag1) {
                        EmptyView()
                    }
                    NavigationLink(destination: DetailView2(tag: self.$tag2), tag: 2, selection: self.$tag2) {
                        EmptyView()
                    }
                    Button(action: {
                        self.tag1 = 1
                    }) {
                        Text("press here to enter DetailView1")
                    }
                }
            }
        }
    }
    

    DetailView1

    struct DetailView1: View {
        @Binding var tag: Int?
        @Environment(\.presentationMode) var presentation
        var body: some View {
            VStack{
                Text("DetailView -> 1")
            }
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading:
                Button(action: {
                    self.tag = 2
                    self.presentation.wrappedValue.dismiss()
                }) {
                HStack {
                     Image(systemName: "arrow.left.circle")
                     Text("Go Back")
                }
            })
        }
    }
    

    DetailView2

    struct DetailView2: View {
        @Binding var tag: Int?
        @Environment(\.presentationMode) var presentation
        var body: some View {
            VStack{
                Text("DetailView -> 2")
            }
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading:
                Button(action: {
                    self.tag = nil 
                    self.presentation.wrappedValue.dismiss()
                }) {
                HStack {
                    Image(systemName: "arrow.left.circle")
                    Text("Go Back")
                }
            })
        }
    }
    

    【讨论】:

    • 谢谢,但是这种方式会创建很多标签变量。就我而言,我将有 3-DetailView、4-DetailView 等。我希望有一种方法可以只创建 1 个标签变量,并将该标签修改为指向 X-DetailView
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多