【问题标题】:How to navigate to a new view from navigationBar button click in SwiftUI如何从导航栏按钮导航到新视图在 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 似乎可以解决问题。当我以模态方式呈现视图时,它仅在我第一次单击按钮时才起作用。后续点击什么也不做。
  • 这是当前模态演示的一个问题,似乎只是一个错误。我假设它会在完全发布之前修复,但是是的,目前这是以模态方式呈现视图的问题。如果您设法解决了您的问题,我建议您回答您自己的问题,然后接受它,以便有类似问题的人可以从您为解决问题所做的工作中学习。

标签: swift swiftui navigationview


【解决方案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://stackoverflow.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()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        • 2021-02-20
        相关资源
        最近更新 更多