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.