如何在SwiftUI中通过navigationBar按钮点击导航到新视图

18

学习SwiftUI。 尝试从导航栏按钮单击导航到新视图。
以下是示例代码:

var body: some View {
    NavigationView {
        List(0...< 5) { item in
            NavigationLink(destination: EventDetails()){
                EventView()
            }
        }
        .navigationBarTitle("Events")
            .navigationBarItems(trailing:
                NavigationLink(destination: CreateEvent()){
                    Text("Create Event")
                }
        )
    }
}

你是想将 CreateEvent 推入导航栈中,还是想以模态方式呈现它? - graycampbell
是的,将其推送到导航堆栈。 - Unikorn
1
根据您提供的代码,我有一个建议。也许这只是示例代码,但在这种情况下,“CreateEvent”应该以模态方式呈现,而不是推送到导航堆栈中。原因是,如果您有一系列事件,每个事件在按下时将详细视图推送到堆栈上,那么创建新事件实际上是与导航堆栈无关的次要操作,并且应该作为临时视图处理,就像在联系人应用程序中创建新联系人或在日历应用程序中创建新的日历事件一样。 - graycampbell
DynamicNavigationDestinationLink 似乎可以解决问题。当我以模态方式呈现视图时,它只在第一次单击按钮时起作用。随后的单击没有任何反应。 - Unikorn
1
这是目前模态呈现的一个问题,似乎只是一个错误。我认为在正式发布之前会被修复,但是目前呈现视图模态存在问题。如果您已经解决了您的问题,我建议您回答自己的问题,然后接受它,以便有类似问题的人可以从您解决问题的方法中学习。 - graycampbell
4个回答

9
将NavigationLink放置在按钮标签内。
.navigationBarItems(
      trailing: Button(action: {}, label: {
         NavigationLink(destination: NewView()) {
              Text("")
         }
      }))

1
navigationBarItems已被弃用。 - Kaunteya
可以工作了!不过有点奇怪的是,动作 - NavigationLink - 必须放在标签下面而不是动作下面... - mark

7

以下是我实现此功能的三个步骤:首先添加一个@State Bool以跟踪新视图的显示:

@State var showNewView = false

添加 navigationBarItem,并设置一个操作,该操作将设置上述属性:
 .navigationBarItems(trailing:
        Button(action: {
            self.showNewView = true
        }) {
            Text("Go To Destination")
        }
    )

最后,在您的视图代码中添加导航链接(这也依赖于视图堆栈中还有导航视图)。

NavigationLink(
            destination: MyDestinationView(),
            isActive: $showNewView
        ) {
            EmptyView()
        }.isDetailLink(false)

谢谢,通过删除“.isDetailLink(false)”它对我有用。 - LetsGoBrandon

3
这对我有效:

    .navigationBarItems(trailing: HStack { AddButton(destination: EntityAddView()) ; EditButton() } )

地点:

struct AddButton<Destination : View>: View {

    var destination:  Destination

    var body: some View {
        NavigationLink(destination: self.destination) { Image(systemName: "plus") }
    }
}

2

目前这是一个iOS13的bug: https://forums.developer.apple.com/thread/124757

这里可以找到“类似”的解决方法: https://dev59.com/I1MI5IYBdhLWcg3wFXSg#57837007

以下是我的解决方案: MasterView -

import SwiftUI

struct MasterView: View {

    @State private var navigationSelectionTag: Int? = 0

    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DestinationView(), tag: 1, selection: self.$navigationSelectionTag) {
                    EmptyView()
                }
                Spacer()
            }
            .navigationBarTitle("Master")
            .navigationBarItems(trailing: Button(action: {
                self.navigationSelectionTag = 1
            }, label: {
                Image(systemName: "person.fill")
            }))
        }
    }
}

struct MasterView_Previews: PreviewProvider {
    static var previews: some View {
        MasterView()
    }
}

还有DetailsView -

import SwiftUI

struct DetailsView: View {
    var body: some View {
        Text("Hello, Details!")
    }
}

struct DetailsView_Previews: PreviewProvider {
    static var previews: some View {
        DetailsView()
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接