如何从导航栏按钮导航到新视图在 SwiftUI 中单击

Posted

技术标签:

【中文标题】如何从导航栏按钮导航到新视图在 SwiftUI 中单击【英文标题】:How to navigate to a new view from navigationBar button click in SwiftUI 【发布时间】:2019-11-23 05:49:09 【问题描述】:

学习 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 推送到导航堆栈上还是想以模态方式呈现它? 是的,推送到导航堆栈。 根据您提供的代码,我确实有一个建议。可能这只是示例代码,但在这种情况下,CreateEvent 应该真正以模态方式呈现,而不是推送到导航堆栈上。原因是,如果您有一个事件列表,每个事件在按下时都会将详细视图推送到堆栈上,那么创建新事件实际上是与导航堆栈无关的次要操作,应该真正作为临时视图处理 - 就像创建一个联系人应用中的新联系人或日历应用中的新日历事件。 DynamicNavigationDestinationLink 似乎可以解决问题。当我以模态方式呈现视图时,它仅在我第一次单击按钮时才起作用。后续点击什么也不做。 这是当前模态演示的一个问题,似乎只是一个错误。我假设它会在完全发布之前修复,但是是的,目前这是以模态方式呈现视图的问题。如果您设法解决了您的问题,我建议您回答您自己的问题,然后接受它,以便有类似问题的人可以从您为解决问题所做的工作中学习。 【参考方案1】:

三个步骤对我有用:首先添加一个@State Bool 来跟踪新视图的显示:

@State var showNewView = false

使用设置上述属性的操作添加 navigationBarItem:

 .navigationBarItems(trailing:
        Button(action: 
            self.showNewView = true
        ) 
            Text("Go To Destination")
        
    )

最后在视图代码的某处添加一个导航链接(这依赖于在视图堆栈中的某处也有一个 NavigationView)

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

【讨论】:

感谢它通过删除.isDetailLink(false)对我有用【参考方案2】:

将 NavigationLink 放入按钮的标签中。

.navigationBarItems(
      trailing: Button(action: , label: 
         NavigationLink(destination: NewView()) 
              Text("")
         
      ))

【讨论】:

【参考方案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") 
    

【讨论】:

【参考方案4】:

目前是ios13的bug:https://forums.developer.apple.com/thread/124757

“某种”解决方法可以在这里找到:https://***.com/a/57837007/4514671

这是我的解决方案: 主视图 -

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()
    

【讨论】:

以上是关于如何从导航栏按钮导航到新视图在 SwiftUI 中单击的主要内容,如果未能解决你的问题,请参考以下文章

更新 SwiftUI 导航栏标题

使用 swiftUI 中的按钮导航到新屏幕

如何在 SwiftUI 中创建共享导航栏以在多个视图之间进行交互? [关闭]

在按钮单击 SwiftUI 时导航到新屏幕

从 SwiftUI 中的导航栏中删除后退按钮文本

如何使用 SwiftUI 显示全栈模式?