我不知道这是否是错误,或者我在这里做错了什么。我在导航栏上添加了一个新按钮,它将显示一个新视图。
struct MyView: View {
@ObservedObject var viewModel = MyViewModel()
var body: some View {
List(viewModel.data, id: \.name) { data in
NavigationLink(destination: MyDetailView(data: data.name)) {
Text(data.name)
}
}
.listStyle(InsetGroupedListStyle())
.edgesIgnoringSafeArea(.all)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink(destination: MyDetailView()) {
Text("New Element")
}
}
}
}
}
正在最新的iOS 14 beta(测试版6)和Xcode 12(测试版6)上对此进行测试。据我所知,当在列表上但在工具栏中时,导航链接可以很好地显示新视图,如图所示并非如此。工具栏上的按钮是可见的且处于活动状态,但不会触发显示新视图。
答案 0 :(得分:9)
NavigationLink
应该在内部 NavigationView
。工具栏不在NavigationView
中,在其中放置按钮。
所以假设您在父母的某个地方
NavigationView {
MyView()
}
这是一个解决方案:
struct MyView: View {
@ObservedObject var viewModel = MyViewModel()
@State private var showNew = false
var body: some View {
List(viewModel.data, id: \.name) { data in
NavigationLink(destination: MyDetailView(data: data.name)) {
Text(data.name)
}
}
.listStyle(InsetGroupedListStyle())
.background(
NavigationLink(destination: MyDetailView(), isActive: $showNew) {
EmptyView()
}
)
.edgesIgnoringSafeArea(.all)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("New Element") {
self.showNew = true
}
}
}
}
}
答案 1 :(得分:7)
我发现使用带有空文本的HStack作为第一个元素也可以使用,它可以使NavigationLink正确运行。
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
HStack {
Text("")
NavigationLink(destination: SettingsView()) {
Image(systemName: "gear")
.font(.title)
}
}
}
答案 2 :(得分:1)
如果您的导航链接指向带有键盘输入的视图,则使用Asperi解决方案可能无法正常工作。
在导航链接之后,新视图中的工具栏已正确加载,但在使用键盘提供输入并关闭键盘时所有工具栏项均消失。
解决方案是将NavigationLink不在View中,而是在NavigationBarItems中,例如:
.navigationBarItems(
leading:
NavigationLink(
destination: Creator(),
isActive: $showCreator,
label: {
Text("")
}))