NavigationLink는 한 번만 작동


75

로그인 응용 프로그램을 작업하고 있었고 로그인 후 범주가 나열되어 있습니다. 그리고 각 범주 아래에 일부 항목이 가로로 나열되어 있습니다. 로그인 후, 메인 페이지가 나타나고 모든 것이 훌륭하게 나열됩니다. 항목을 클릭하면 상세 화면으로 이동하지만 돌아 가려고하면 충돌이 발생합니다. 이 흐름을 찾았습니다 .`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를 처음 접했고 모든 것이 훌륭하지만 탐색입니다. 인터넷에서 많은 예제를 시도하고 솔루션을 제안했지만 내 문제를 해결하는 것은 없습니다.


2
xCode 11.2 (11B52) 버전의 경우이 코드는 캔버스와 장치 모두에서 예상대로 작동합니다.
Александр Грабовский

3
Xcode 11.2 / iOS 13.2로 코드 스냅 샷을 테스트했습니다. Xcode를 다운 그레이드하십시오.
Asperi

1
Xcode 버전 11.2.1 (11B500) 코드가 정상적으로 작동합니다.
Nalov

2
Apple에 리뷰를 보냈습니다. 향후 업데이트를 기다려야합니다.
Александр Грабовский

1
보낸 버그 보고서 FB7518930
Pacu

답변:


56

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


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


10
나도 똑같아 나는 새로운 앱을 위해 Swiftui를 선택한 것을 후회하기 시작했습니다
theMouk

6
방금 4 시간 동안 멍청한 느낌이 들었습니다 ...이 물건은 생산 준비가되지 않았습니다 ...
Sebastian

SwiftUI는 여전히 기본적으로 버전 1.0입니다. 프로덕션 릴리스에 v 1.0을 사용할 계획입니까? 개선 될 것이라는 기대로 시작합니다. 그렇게하기 전에 릴리스해야 할 경우에는 도움이되지 않습니다.
David Reich

@DavidReich SwiftUI가 베타 버전이라면 많은 문제가 있음을 이해할 수있었습니다. 생산 준비 툴링에서 가장 기대되는 것은 작동한다는 것입니다. 작년 초판 이후 iOS와 macOS에 대한 몇 가지 "포인트 업데이트"가 있었기 때문에 이와 같은 눈부신 버그 나 "점프 목록 제목 버그"는 오래 전에 스쿼시되었을 것입니다. 프로덕션 앱에 사용하려고 시도했지만 적절한 결과를 얻으려면 UIKit으로 돌아 가야했습니다.
GJ Nilsen

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

5

시뮬레이터 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") }))
    }
}

NavigationLink를 두 번 이상 작동시키는 데 시뮬레이터와 실제 장치 모두에 문제가 있습니다. 시뮬레이터에서 아무것도 고치지는 않지만 내 물리적 장치에서 작동하는 이와 유사한 방법은 View2에서 onDisappear를 설정하여 활성 플래그를 재설정합니다. Xcode 버그에 대한 약간의 해결 방법입니다 (View2가 알지 못하는 상태에 바인딩 할 필요가 없기 때문에). NavigationViewDemo_View2 (). onDisappear (수행 : {self.isActive = false})
SJoshi

@SJoshi 나는 그것을 얻었지만 onDisappear 후에 호출 될 isActive것이므로 NavigationView가 제대로 작동하지 않습니다. NavigationView가 장치에서 올바르게 작동하기 때문에 에뮬레이터의 임시 솔루션입니다. NavigationView의 이전 버전의 에뮬레이터에서는 향후 에뮬레이터에서 수정되기를 바랍니다.
빅터 쿠 슈네 로프

이상하게 도이 코드는 시뮬레이터 또는 실제 장치에서 작동하지 않습니다. 제안한 솔루션은 상세보기가 닫힐 때 활성 플래그를 재설정하고 실제 장치가 작동하도록합니다. 거리에서 Xcode 13.4가이 문제를 해결한다는 것입니다
SJoshi

시뮬레이터 11.3.1에서 테스트 한 결과 매력처럼 작동합니다. 당신은 3 다른 사람들도 도움이되었다고 가정 시작 참조하십시오.
빅터 쿠 슈네 로프

그래, 나도 여러 iPhone을 사용하여 테스트했습니다. 또한 운이없는 4 개의 물리적 장치에서 테스트되었습니다. 이 버그는 확실히 우스운 버그입니다. 그 동안 시뮬레이터에 대한 어리석은 해결 방법을 찾았습니다.
SJoshi


1

@ Александр Грабовский가 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)
            }
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.