我有一个ListView
,TasksView
和一个EditView
。
流程如下:您有一个列表单元格,点击带您到TasksView
的单元格。在TasksView
中点击一行时,您将转到EditView
。
当我向后滑动一半以导航到上一个视图时,导航栏将变成疯子并重叠。发生这种情况主要是因为我使用了navigationBarItem-(按钮)。
在TasksView (detailView)
中有一个列表和一些导航栏修饰符:
ZStack {
List {
// code here
}
}
.onAppear { UITableView.appearance().separatorStyle = .none }
.onDisappear { UITableView.appearance().separatorStyle = .none }
.background(Color("primaryBackground"))
.edgesIgnoringSafeArea(.bottom)
.navigationBarTitle("\(listItem.name ?? "")", displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {self.deleteList()}) {
Image(systemName: "trash.circle.fill")
}
)
EditView
可以说是相同的,即当您在EditView
上滑动一半以返回TasksView
时,同样的事情也会发生。
以下是运行中的错误:
有人知道如何解决此错误吗?
编辑:
struct TasksView: View {
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var taskControl: TaskControl
@EnvironmentObject var addNewTaskData: AddNewTaskViewDataFlow
@ObservedObject var dataPickerData : DatePickerDataFlowV2
@FetchRequest(entity: ONList.entity(), sortDescriptors: []) var listsDataSource: FetchedResults<ONList>
@Environment(\.managedObjectContext) var listMOC
var listItem: ONList
var keyboardPublisher: AnyCancellable
// defining the presentationMode here
.......
ZStack {
NavigationLink(destination: ListOptions(listItem: listItem), tag: 1, selection: self.$navigationSelectionTag) {
EmptyView()
}
Color("primaryBackground")
.edgesIgnoringSafeArea(.top)
//... more code here
}
.onAppear {
UITableView.appearance().separatorStyle = .none
self.taskControl.taskViewerSeperator = true
}
.onDisappear {
UITableView.appearance().separatorStyle = .none
print("Bye Task View")
if UIDevice.current.userInterfaceIdiom == .phone {
self.taskControl.taskViewerSeperator = false
}
self.keyboardPublisher.cancel()
}
.navigationBarTitle("\(listItem.name ?? "")", displayMode: .inline)
.background(Color("primaryBackground"))
.edgesIgnoringSafeArea(.bottom)
.navigationBarItems(trailing:
HStack {
Button(action: {
self.navigationSelectionTag = 1
}, label: {
Image(systemName: "gear")
})
Button(action: {
self.deleteList()
}) {
Image(systemName: "trash.circle.fill")
}.padding()
}
)
我什至没有使用deleteList()
函数中的presentationMode来删除当前视图。但是,我仍然遇到与上面的gif所示相同的故障。
更新:
struct TestingCoreData: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: DestinationView()) {
Text("This is a test")
}
}.navigationBarTitle(Text("Master"), displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
print("tapped")
}) {
Text("Button")
}
)
}
}
}
struct DestinationView: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
List {
Text("DestinationView")
.padding(.top, 100)
.navigationBarTitle(Text("Destination"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
self.presentationMode.wrappedValue.dismiss()
}, label: {
Text("second")
}))
}
}
}
上面的代码再现了该错误。当您单击“这是测试”按钮,然后向后轻扫一下,然后返回上一个视图时,您将看到导航栏变得混乱!
答案 0 :(得分:4)
我找到了解决您问题的简单解决方案,请将其添加到NavigationView
NavigationView {
....
}.navigationViewStyle(StackNavigationViewStyle())
编辑:这是我用来在真实设备和各种模拟器上测试答案的代码。如果您发现无法正常工作的设备,请告诉我。
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: DestinationView()) {
Text("This is a test")
}
}.navigationBarTitle(Text("Master"), displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
print("tapped")
}) {
Text("Button")
})
}.navigationViewStyle(StackNavigationViewStyle())
}
}
struct DestinationView: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
List {
Text("DestinationView")
.padding(.top, 100)
.navigationBarTitle(Text("Destination"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
self.presentationMode.wrappedValue.dismiss()
}, label: {
Text("second")
}))
}
}
}
答案 1 :(得分:1)
我一直在努力解决同样的问题。所以我决定制作一个带有视图修饰符的自定义导航栏,我正在使用它。
但我想我现在找到了另一个解决方案。
尝试在 .isDetailLink(false)
后立即添加 NavigationLink
。
NavigationLink(destination: DestinationView()) {
Text("This is a test")
}
.isDetailLink(false)
答案 2 :(得分:0)
使用 .toolbar 和 ToolbarItem 而不是旧的 .navigationBarItems 可以解决问题。
另请注意,我已将导航修饰符从 Text 移至 List。
这是一个基于您的UPDATE代码的工作和测试示例:
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: DestinationView()) {
Text("This is a test")
}
}
.navigationBarTitle(Text("Master"), displayMode: .inline)
// use .toolbar instead of .navigationBarItems
.toolbar {
ToolbarItem(placement: .navigationBarTrailing){
Button("Button", action: {
print("tapped")
})
}
}
}
}
}
struct DestinationView: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
List {
Text("DestinationView")
.padding(.top, 100)
}
.navigationBarTitle(Text("Destination"), displayMode: .inline)
// use .toolbar instead of .navigationBarItems
.toolbar {
ToolbarItem(placement: .navigationBarTrailing){
Button("second", action: {
self.presentationMode.wrappedValue.dismiss()
})
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}