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


10

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


나는 확실하지 않다. 그러나 당신은 NavigationLink내부 를 감싸고 에서 NavigationView제거 해서는 안 됩니까? 나는 그 주위에서 그렇게하는 몇 가지 예를 보았습니다. NavigationViewFileView
— Giovanni

@GiovanniTerlingen 당신이 말하는 것을 오해하지 않는 한, 이것은 내가하고있는 일입니다. 의 NavigationLink내부에 FileView싸여있다 NavigationView따라서 NavigationLink내부에 싸여있다NavigationView
— Vapidant

최소한의 실행 가능한 프로젝트를 제공하십시오. 나는 이것을 재현 할 수 없으므로 아마도 SwiftUI의 버그 중 하나가 아닙니다.
— Mojtaba Hosseini

당신은 내가 당신의 문제를 해결할 수 있도록 전체 소스 코드를 제공 할 수 있습니까
— Hardik Bar

어떻게 준비 cellArray했습니까?
— E.Coms

답변:


5

같은 문제가 있었다-이것을 시도하십시오. 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, 즉 다른 링크 목록으로 연결되는 링크가있는 경우이 솔루션은 부작용을 만듭니다. 스택은 두 번째 시도에서 마지막 뷰를 표시하기 위해 원점으로 돌아갑니다.


이 버그는 최신 IOS 버전에서 수정되었습니다. 나는 서있는 문제를 해결했기 때문에 이것을 정답으로 표시하고 있지만 문제는 아닙니다. 나는 또한 당신의 문제에 대한 당신의 설명을 좋아합니다. 감사합니다.
— Vapidant

최신 iOS 버전을 말할 때 13.4 또는 베타 버전을 의미합니까?
— Ricardo Alves

나도 알고 싶다 어떤 버전이 올바르게 작동합니까? 나는 13.3 (현재 최신 iOS)을 가지고 있으며 문제는 여전히 존재합니다.
— 맬로

나는이 버그가 IOS 13.3 베타 빌드에서 제시되었지만 IOS 13.3 베타 4에서 수정되었다고 생각합니다.
— Vapidant
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.