我有一个 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
同样的事情也会发生。
下面是这个错误的行动。
有谁知道如何解决这个错误?
EDIT:
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()
}
)
我甚至没有使用presentationMode在 deleteList()
函数,以便在当前视图被删除时将其删除。然而,我仍然得到同样的故障,如上图所示。
更新:上面的代码重现了这个错误。
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")
}))
}
}
}
上面的代码再现了这个错误。当你点击 "This is a test "按钮,然后向后滑动一下,再回到上一个View时,你会看到导航条乱了套!我有一个ListView,一个Tasks,一个View,一个View。
我找到了一个简单的解决方案来解决你的问题,在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")
}))
}
}
}