如何从导航栏按钮导航到新视图在 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 中单击的主要内容,如果未能解决你的问题,请参考以下文章