У меня есть ListView
, TasksView
, а затем EditView
.
Процесс выглядит следующим образом: у вас есть ячейка списка, вы нажимаете на ту, которая ведет к TasksView
Когда строка нажимается в TasksView
, вы переходите к EditView
.
Когда я наполовину смахиваю назад, чтобы перейти к предыдущему виду, панель навигации go bezerk и перекрывается. Это происходит в основном, если я использую 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
происходит то же самое.
Вот ошибка в действии:
Кто-нибудь знает, как go об исправлении этой ошибки?
РЕДАКТИРОВАТЬ:
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()
, чтобы отклонить текущее представление при его удалении. Однако я все еще получаю тот же сбой, что и на гифке выше.
ОБНОВЛЕНИЕ:
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")
}))
}
}
}
Приведенный выше код воспроизводит ошибку. Если вы нажмете кнопку «Это тест», а затем проведете немного назад, а затем go вернетесь к последнему просмотру, вы увидите, что панель навигации пошла наперекосяк!