按钮,如何在嵌入导航栏的swiftUI中打开新视图

按钮,如何在嵌入导航栏的swiftUI中打开新视图,swift,swiftui,Swift,Swiftui,我在导航栏上嵌入了一个按钮。 我正在尝试使用按钮打开一个新的视图,名为DetailView 我尝试使用NavigationLink,但它在按钮内部不起作用 import SwiftUI struct ContentView: View { @ObservedObject var dm: DataManager @State var isAddPresented = false var body: some View { NavigationView

我在
导航栏上嵌入了一个按钮。
我正在尝试使用按钮打开一个新的
视图
,名为
DetailView

我尝试使用
NavigationLink
,但它在按钮内部不起作用

import SwiftUI

struct ContentView: View {

    @ObservedObject var dm: DataManager

    @State var isAddPresented = false
    var body: some View {
        NavigationView {
            HStack {
                List () {
                    ForEach (dm.storage) { data in
                        StileCella(dm2: data)
                    }
                }
                .navigationBarTitle("Lista Rubrica")
                .navigationBarItems(trailing: Button(action: {
                        self.isAddPresented = true
                   // Load here the DetailView??? How??
                        DetailView()
                    }) {
                        Text("Button")
                    })
            }
        }
    }
}



struct DetailView: View {

    var body: some View {
        VStack(alignment: .center) {
            Text("CIAO").bold()
            Spacer()
            Image(systemName: "star")
                .resizable()
        }
    }
}

您只需向视图添加一个图纸修改器,该修改器根据isAddPresented的值显示视图,如下所示:

struct ContentView: View {

    @State var isAddPresented = false

    var body: some View {
        NavigationView {
            List(dm.storage){ data in
                StileCella(dm2: data)
            }
            .navigationBarTitle("Lista Rubrica")
            .navigationBarItems(trailing: Button("Button") {
                self.isAddPresented = true
            })
        }   .sheet(isPresented: $isAddPresented,
                   onDismiss: { self.isAddPresented = false }) {
                        DetailView()
                    }
    }
}

重要的一点是要记住,在关闭时将isAddPresented设置回false,以防止它再次显示。

如果您想打开一个新视图,就像我们以前通过故事板(而不是图纸)打开一样,可以通过以下方式更新代码:

import SwiftUI

struct ContentView: View {

    @ObservedObject var dm: DataManager

    @State var isAddPresented = false
    var body: some View {
        NavigationView {
            HStack {
                List () {
                    ForEach (dm.storage) { data in
                        StileCella(dm2: data)
                    }
                }
                .navigationBarTitle("Lista Rubrica")
                .navigationBarItems(leading:
                    NavigationLink(destination: DetailView()) {
                    Text("Button")
                })
            }
        }
    }
}



struct DetailView: View {

    var body: some View {
        VStack(alignment: .center) {
            Text("CIAO").bold()
            Spacer()
            Image(systemName: "star")
                .resizable()
        }
    }
}
只需在navigationBarItems中添加NavigationLink,而不是按钮。这就行了!我写了完整的指南,但主要的变化点是,我使用

.navigationBarItems(leading:
      NavigationLink(destination: DetailView()) {
           Text("Button")
      })
而不是:

.navigationBarItems(trailing: Button(action: {
     self.isAddPresented = true
      // Load here the DetailView??? How??
         DetailView()
     }) {
            Text("Button")
     })

嗯,
NavigationLink
在很多方面都是一个按钮。您是否正在尝试将
按钮
导航视图
一起使用?大多数iOS应用程序都应该使用
导航链接
——用户希望这样。请更详细地解释一下你想要什么,你想实现什么。特别是,为什么NavigationView中的NavigationLink不够。谢谢。我找到了解决方案,问题是NavigationLink必须包含在一个堆栈中,或者要在bar项的按钮中实现的堆栈中