Элементы панели навигации SwiftUI выходят из строя, когда смахивать назад не удается - PullRequest
7 голосов
/ 29 мая 2020

У меня есть 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 происходит то же самое.

Вот ошибка в действии:

enter image description here

Кто-нибудь знает, как 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 вернетесь к последнему просмотру, вы увидите, что панель навигации пошла наперекосяк!

1 Ответ

1 голос
/ 11 июня 2020

Я нашел простое решение для решения вашей проблемы, добавьте его в 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")
            }))
    }
}
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...