[ios] SwiftUI에서 이전에 클릭 한 NavigationLink를 다시 방문하려고하면 NavigationLink가 정지됨

JSON 데이터를 검색하고 검색 된 항목 목록을 FileBrowser 유형보기에 표시하는 기능이 포함 된 앱을 설계하고 있습니다. 이보기에서 사용자는 폴더를 클릭하여 파일 트리를 자세히 살펴 보거나 파일을 클릭하여 해당 파일에 대한 일부 메타 데이터를 볼 수 있어야합니다.

이것이 작동하는 동안 파일이나 폴더를 클릭 한 다음 되돌아 가서 다시 클릭하면 NavigationLink가 트리거되지 않고 다른 NavigationLink를 클릭 할 때까지보기에 고정되어 있음을 관찰했습니다.

이 문제를 보여주는 GIF가 있습니다.

더블 탭 버그

여기에서 볼 수 있듯이 BlahBlah를 클릭하면 NavigationLink를 활성화하고 BlahBlah로 이동 한 다음 다시 탐색하여 BlahBlah로 다시 이동하려고하면 회색으로 바뀌고 클릭 한 것으로 등록되지만 … . TestFile을 클릭하면이 문제가 해결되고 BlahBlah로 다시 이동할 수 있습니다.

리스트 아이템은 다음 구조체로 만들어집니다

private struct FileCell{
    var FileName: String
    var FileType: String
    var FileID: String = ""
    var isContainer: Bool
}

private struct constructedCell: View{

    var FileType: String
    var FileName: String
    var FileID: String

    var body: some View {
        return
            HStack{
                VStack(alignment: .center){
                    Image(systemName: getImage(FileType: FileType)).font(.title).frame(width: 50)
                }
                Divider()
                VStack(alignment: .leading){
                    Text(FileName).font(.headline)
                        .multilineTextAlignment(.leading)
                    Text(FileID)
                        .font(.caption)
                        .multilineTextAlignment(.leading)
                }
        }
    }
}

다음과 같이 navigationLinks를 사용하여 볼 수 있습니다.

List(cellArray, id: \.FileID) { cell in
                if (cell.isContainer) {
                    NavigationLink(destination: FileView(path: "/\(cell.FileID)", displaysLogin: self.$displaysLogin).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                } else {
                    NavigationLink(destination: DetailView(FileID: cell.FileID).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                }
            }

내 NavigationView는 위의보기에서 초기화됩니다 (앱에는 탭보기가 있음).

TabView(selection: $selection){
               NavigationView{
                    FileView(displaysLogin: self.$displaysLogin)
                        .navigationBarTitle("Home", displayMode: .inline)
                        .background(NavigationConfigurator { nc in
                            nc.navigationBar.barTintColor = UIColor.white
                            nc.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.black]
                        })
                }
                .font(.title)
                .tabItem {
                    VStack {
                        Image(systemName: "folder.fill")
                        Text("Files")
                    }
                }
                .tag(0)
}

NavigationConfigurator는 navigationBar의 색상을 처리하는 데 사용하는 구조체입니다. 그렇게 설정되어 있습니다

struct NavigationConfigurator: UIViewControllerRepresentable {
    var configure: (UINavigationController) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
        UIViewController()
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
        if let nc = uiViewController.navigationController {
            self.configure(nc)
        }
    }

}

내 NavigationConfigurator가이 문제를 일으키는 것으로 생각하지 않습니까? 이 버그는 앱의 다른 navigationLink에서도 발생하지만 FileBrowser보기에서 가장 쉽게 설명 할 수 있습니다.

이것은 SwiftUI의 버그일까요? 누구 든지이 문제를 해결할 수있는 방법을 알고 있습니까? 그렇지 않은 경우, 내가 뭘 잘못하고 있습니까?



답변

같은 문제가 있었다-이것을 시도하십시오. swiftUI의 버그가 수정되면 제거 할 핵이라고 부릅니다.

struct ListView: View {
@State private var destID = 0
...
var body: some View {
...
  NavigationLink(destination: FileView(path: "/\(cell.FileID)", displaysLogin: self.$displaysLogin)
   .navigationBarTitle(cell.FileName)
   .onDisappear() { self.destID = self.destID + 1 }
  ){
   constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
  }.id(destID)

기본적으로 일부 상황 (iOS 13.3-시뮬레이터?)에서는 대상 스택이 탐색 스택에서 제거 될 때 NavigationLink가 재설정되지 않는 것 같습니다. 이 문제를 해결하려면 탐색 링크를 다시 생성해야합니다. 이것이 ID를 변경하는 것입니다. 이것은 내 문제를 해결했습니다.

그러나 체인으로 연결된 NavigationLinks, 즉 다른 링크 목록으로 연결되는 링크가있는 경우이 솔루션은 부작용을 만듭니다. 스택은 두 번째 시도에서 마지막 뷰를 표시하기 위해 원점으로 돌아갑니다.


답변