[ios] NavigationLink는 한 번만 작동

로그인 응용 프로그램을 작업하고 있었고 로그인 후 범주가 나열되어 있습니다. 그리고 각 범주 아래에 일부 항목이 가로로 나열되어 있습니다. 로그인 후, 메인 페이지가 나타나고 모든 것이 훌륭하게 나열됩니다. 항목을 클릭하면 상세 화면으로 이동하지만 돌아 가려고하면 충돌이 발생합니다. 이 흐름을 찾았습니다 .`NavigationView`의`navigationBarItems` 안에`NavigationLink`를 배치 한 후 뒤로 탐색 할 때 왜 SwiftUI 앱이 충돌합니까? 그러나 나는 내 문제를 해결할 수 없었다. 프로젝트가 복잡해지면서 swiftui에서 탐색을 연습하고 싶었고 새 프로젝트를 만들었습니다. 그런데 최신 xcode 버전 11.3을 다운로드했습니다. 다음과 같이 간단한 코드를 작성했습니다.

NavigationView{
        NavigationLink(destination: Test()) {
            Text("Show Detail View")
        }
    .navigationBarTitle("title1")

그리고 Test ()보기는 다음과 같습니다.

import SwiftUI

struct Test: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}

보시다시피 정말 간단합니다. 나는 또한 인터넷에서 비슷한 예제를 시도했지만 작동하는 방식으로 작동하지 않습니다. 프로젝트를 실행할 때 탐색 링크를 클릭하면 Test ()보기로 이동합니다. 그런 다음 뒤로 버튼을 클릭하면 메인 페이지로 이동합니다. 그러나 탐색 링크를 두 번 클릭해도 아무런 변화가 없습니다. 탐색 링크는 한 번만 작동 한 후에 아무 일도 일어나지 않습니다. 탐색하지 않으며 오류가 발생하지 않습니다. 나는 swiftui를 처음 접했고 모든 것이 훌륭하지만 탐색입니다. 인터넷에서 많은 예제를 시도하고 솔루션을 제안했지만 내 문제를 해결하는 것은 없습니다.



답변

[업데이트] 2020 년 2 월 12 일-Xcode 11.4 베타에서이 문제를 확인한 결과이 문제가 해결되었습니다.


Xcode의 시뮬레이터에서 테스트 할 때 프로젝트에서도 동일한 문제가 발생했습니다. 그러나 실제 장치 (iOS 13.3이 설치된 iPhone X)에서 앱을 시작했을 때 NavigationLink완전히 작동했습니다. 따라서 실제로 Xcode의 버그처럼 보입니다.


답변

시뮬레이터 11.4 :이 문제는 해결되었습니다

isActive두 번째보기에서 기본값을 재설정해야합니다 . 장치 및 에뮬레이터에서 작동합니다.

struct NavigationViewDemo: View {
    @State var isActive = false

    var body: some View {
        NavigationView {
            VStack {
                Text("View1")
                NavigationLink(
                    destination: NavigationViewDemo_View2(isActive: $isActive),
                    isActive: $isActive,
                    label: { Button(action: { self.isActive = true }, label: { Text("click") }) })
            }
        }
    }
}

struct NavigationViewDemo_View2: View {
    @Binding var isActive: Bool

    var body: some View {
        Text("View2")
            .navigationBarItems(leading: Button(action: { self.isActive = false }, label: { Text("Back") }))
    }
}


답변

애플이 13.3을 배포 대상으로 선택할 수없는 관련 버그를 수정하면이 문제가 해결 될 것 입니다.

다른 사람들과 같은 문제가 발생했습니다. 이 문제는 13.2를 실행하는 시뮬레이터 및 미리보기에 있지만 13.3을 실행하는 내 자신의 장치에 배포 할 때 수정되었습니다.


답변

@ Александр Грабовский가 Xcode 11.3 버그처럼 보인다고 말하면서 동일한 문제가 발생하므로 아래처럼 사용자 정의 뒤로 버튼과 같은 해결 방법을 다운 그레이드하거나 사용해야합니다

struct ContentView: View {
    @State private var pushed: Bool = false

    var body: some View {

        NavigationView {
            VStack {
                Button("Show Detail View") {
                    self.pushed.toggle()
                }

                NavigationLink(destination: Test(pushed: $pushed), isActive: $pushed) { EmptyView() }
            }.navigationBarTitle("title1")
        }
    }
}
struct Test: View {
    @Binding var pushed: Bool
    var body: some View {
        Text("Hello, World!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: BackButton(label: "Back") {
                self.pushed = false
            })
    }
}
struct BackButton: View {
    let label: String
    let closure: () -> ()

    var body: some View {
        Button(action: { self.closure() }) {
            HStack {
                Image(systemName: "chevron.left")
                Text(label)
            }
        }
    }
}


답변