NavigationLink chỉ hoạt động một lần


75

Tôi đã làm việc trên một ứng dụng có đăng nhập và sau khi đăng nhập có các danh mục được liệt kê. Và dưới mỗi danh mục có một số mặt hàng được liệt kê theo chiều ngang. Điều này là sau khi đăng nhập, trang chính xuất hiện và mọi thứ được liệt kê tuyệt vời. Khi bạn nhấp vào một mục, nó sẽ chuyển đến màn hình chi tiết nhưng khi bạn cố gắng quay lại thì nó chỉ gặp sự cố. Tôi đã tìm thấy luồng này Tại sao ứng dụng SwiftUI của tôi gặp sự cố khi điều hướng lùi sau khi đặt một `NavigationLink` bên trong một` navigationBarItems` trong một` NavigationView`? nhưng tôi không thể giải quyết vấn đề của mình. Vì dự án của tôi trở nên phức tạp, tôi chỉ muốn thực hành điều hướng trong swiftui và tôi đã tạo ra một dự án mới. Nhân tiện, tôi đã tải xuống phiên bản xcode mới nhất 11.3. Tôi đã viết một mã đơn giản như sau:

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

Và khung nhìn Test () như sau:

import SwiftUI

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

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

Như bạn có thể thấy nó thực sự đơn giản. Tôi cũng đã thử các ví dụ tương tự trên internet nhưng nó không hoạt động theo cách nó cho là hoạt động. Khi tôi chạy dự án, tôi nhấp vào liên kết điều hướng và nó điều hướng đến chế độ xem Test (). Sau đó, tôi nhấp vào nút quay lại và nó điều hướng đến trang chính. Tuy nhiên, khi tôi nhấp vào liên kết điều hướng lần thứ hai, không có gì xảy ra. Liên kết điều hướng chỉ hoạt động một lần và sau đó không có gì xảy ra. Nó không điều hướng, nó không ném bất kỳ lỗi nào. Tôi mới đến swiftui và mọi thứ đều tuyệt vời nhưng điều hướng. Tôi đã thử nhiều ví dụ và đề xuất giải pháp trên internet, nhưng dường như không có gì có thể khắc phục vấn đề của tôi.


2
phiên bản của xCode 11.2 (11B52), mã này hoạt động như mong đợi trên cả khung vẽ và thiết bị
Tiếng Pháp là

3
Đã kiểm tra ảnh chụp mã của bạn với Xcode 11.2 / iOS 13.2 - hoạt động tốt. Cố gắng hạ cấp Xcode.
Asperi

1
Xcode phiên bản 11.2.1 (11B500) mã của bạn hoạt động như bình thường.
Nalov

2
Tôi đã gửi một đánh giá cho Apple, nó vẫn còn phải đợi cho một bản cập nhật trong tương lai
Александр Грабовский

1
Đã gửi báo cáo lỗi FB7518930
Pacu

Câu trả lời:


56

[CẬP NHẬT] Ngày 12 tháng 2 năm 2020 - Tôi đã kiểm tra vấn đề này trong Xcode 11.4 beta và thấy rằng vấn đề này đã được giải quyết.


Tôi cũng gặp vấn đề tương tự trong dự án của mình, khi tôi đang thử nghiệm nó trong trình giả lập của Xcode. Tuy nhiên, khi tôi khởi chạy ứng dụng trên một thiết bị thực (iPhone X với iOS 13.3), NavigationLinkđã hoạt động hoàn toàn tốt. Vì vậy, nó thực sự có vẻ giống như lỗi của Xcode.


10
hoàn toàn giống tôi Tôi bắt đầu hối hận vì đã chọn Swiftui cho một ứng dụng mới
theMouk

6
tôi mới trải qua 4 giờ cảm thấy rất ngu ngốc ... Công cụ này chưa sẵn sàng để sản xuất ...
Sebastian

SwiftUI về cơ bản vẫn là phiên bản 1.0 Bạn đã bao giờ lên kế hoạch sử dụng v 1.0 của bất cứ thứ gì cho bản phát hành sản xuất chưa? Bạn bắt đầu với nó với kỳ vọng rằng nó sẽ được cải thiện. Điều này không có ích nếu bạn cần phát hành trước khi điều đó xảy ra.
David Reich

@DavidReich nếu SwiftUI đang trong giai đoạn thử nghiệm, tôi có thể hiểu rằng sẽ có rất nhiều vấn đề. Trong công cụ sẵn sàng sản xuất, ít nhất người ta phải mong đợi là nó hoạt động. Đã có một số "cập nhật điểm" của iOS và macOS kể từ lần phát hành đầu tiên vào năm ngoái, vì vậy những lỗi phát sáng như thế này hoặc "lỗi tiêu đề danh sách nhảy" đã bị xóa sạch từ lâu. Tôi đã cố gắng sử dụng nó cho một ứng dụng sản xuất, nhưng phải quay lại UIKit để có kết quả tốt.
GJ Nilsen

3
[CẬP NHẬT] Ngày 12 tháng 2 năm 2020 - Tôi đã kiểm tra vấn đề này trong Xcode 11.4 beta và thấy rằng vấn đề này đã được giải quyết.
Sagun Raj Lage

5

Trình mô phỏng 11.4: Sự cố này đã được khắc phục

Bạn cần đặt lại isActivegiá trị mặc định trong chế độ xem thứ hai. Nó hoạt động trên các thiết bị và trình giả lập.

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") }))
    }
}

Tôi gặp sự cố với cả trình giả lập và thiết bị vật lý của mình khi điều hướng NavigationLink hoạt động nhiều lần. Không có gì sửa nó trong trình giả lập, nhưng một phương pháp tương tự với phương pháp hoạt động cho thiết bị vật lý của tôi là cài đặt onDisappear trên View2 để đặt lại cờ hoạt động. Đó là một cách giải quyết rõ ràng hơn đối với lỗi Xcode (vì bạn không phải liên kết với trạng thái mà View2 không nên biết). NavigationViewDemo_View2 (). OnDisappear (thực hiện: {self.isActive = false})
SJoshi

@SJoshi Tôi đã nhận nó nhưng onDisappear sẽ được gọi sau isActivelà sai vì vậy NavigationView sẽ không hoạt động đúng. Đó là giải pháp tạm thời cho trình giả lập chỉ vì NavigationView hoạt động chính xác trên thiết bị. Trong các phiên bản trước của trình giả lập NavigationView đã hoạt động, tôi hy vọng nó sẽ được sửa trong trình giả lập trong tương lai.
Victor Kushnerov

Thật kỳ lạ, mã này không hoạt động trên trình giả lập HOẶC thiết bị vật lý của tôi - giải pháp tôi đề xuất đặt lại cờ hoạt động khi chế độ xem chi tiết bị loại bỏ và cho phép thiết bị vật lý hoạt động. Tin tức trên đường phố là Xcode 13.4 khắc phục vấn đề này
SJoshi

Tôi đã thử nghiệm trên trình giả lập 11.3.1, nó hoạt động như một bùa mê. Bạn thấy 3 bắt đầu tôi cho rằng những người khác cũng giúp đỡ.
Victor Kushnerov

Đúng, tôi cũng vậy, đã thử nghiệm trên đó - sử dụng nhiều iPhone. Ngoài ra, thử nghiệm trên 4 thiết bị vật lý - không có may mắn. Lỗi này chắc chắn là một điều vô lý. Tôi đã kết thúc một số cách giải quyết lố bịch trong thời gian chờ đợi cho trình giả lập.
SJoshi


1

Như @ ĐẠI LÝ, nói rằng nó giống như lỗi Xcode 11.3, tôi gặp phải vấn đề tương tự, bạn phải hạ cấp hoặc sử dụng một số cách khắc phục như nút quay lại tùy chỉnh như bên dưới

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)
            }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.