NavigationLink ใช้งานได้เพียงครั้งเดียว


75

ฉันกำลังทำงานกับแอปพลิเคชันที่มีการเข้าสู่ระบบและหลังจากเข้าสู่ระบบมีหมวดหมู่ที่ระบุไว้ และภายใต้แต่ละหมวดหมู่มีบางรายการที่แสดงในแนวนอน สิ่งนี้เกิดขึ้นหลังจากการเข้าสู่ระบบหน้าหลักจะปรากฏขึ้นและทุกอย่างก็อยู่ในรายการที่ยอดเยี่ยม เมื่อคุณคลิกที่รายการมันจะไปที่หน้าจอรายละเอียด แต่เมื่อคุณพยายามที่จะกลับไปมันก็เกิดปัญหา ฉันพบโฟลว์นี้ทำไมแอป SwiftUI ของฉันจึงล้มเหลวเมื่อนำทางไปด้านหลังหลังจากวาง "NavigationLink" ใน "navigationBarItems`" ใน "NavigationView" แต่ฉันไม่สามารถแก้ปัญหาของฉันได้ เนื่องจากโครงการของฉันซับซ้อนฉันแค่ต้องการฝึกการนำทางใน 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()
    }
}

อย่างที่คุณเห็นมันง่ายจริงๆ ฉันยังลองตัวอย่างที่คล้ายกันบนอินเทอร์เน็ต แต่มันไม่ทำงานอย่างที่มันควรจะเป็น เมื่อฉันเรียกใช้โครงการฉันคลิกที่ลิงค์การนำทางและไปที่มุมมองทดสอบ () จากนั้นฉันคลิกปุ่มย้อนกลับและไปที่หน้าหลัก อย่างไรก็ตามเมื่อฉันคลิกลิงก์การนำทางครั้งที่สองจะไม่มีอะไรเกิดขึ้น ลิงค์การนำทางใช้งานได้เพียงครั้งเดียวและหลังจากนั้นไม่มีอะไรเกิดขึ้น มันไม่ได้นำทางมันไม่ได้โยนข้อผิดพลาดใด ๆ ฉันใหม่เพื่อ 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

[อัพเดท] 12 ก.พ. 2020 - ฉันตรวจสอบปัญหานี้ใน Xcode 11.4 เบต้าแล้วและพบว่าปัญหานี้ได้รับการแก้ไขแล้ว


ฉันได้รับปัญหาเดียวกันในโครงการของฉันด้วยเมื่อฉันทดสอบในเครื่องจำลองของ Xcode อย่างไรก็ตามเมื่อฉันเปิดตัวแอปบนอุปกรณ์จริง (iPhone X ที่มี iOS 13.3) NavigationLinkทำงานได้ดีโดยสิ้นเชิง ดังนั้นมันจึงดูเหมือนข้อผิดพลาดของ Xcode


10
เหมือนกันสำหรับฉัน ฉันเริ่มเสียใจที่เลือก Swiftui เป็นแอพใหม่
theMouk

6
ฉันเพิ่งใช้เวลา 4 ชั่วโมงรู้สึกงี่เง่ามาก ... สิ่งนี้ยังไม่พร้อมสำหรับการผลิต ...
เซบาสเตียน

SwiftUI ยังคงเป็นเวอร์ชั่น 1.0 คุณเคยวางแผนที่จะใช้ v 1.0 ของอะไรในการผลิตจริงหรือไม่? คุณเริ่มต้นด้วยความคาดหวังว่าจะปรับปรุง สิ่งนี้ไม่ได้ช่วยถ้าคุณต้องการปล่อยก่อนที่จะเกิดขึ้น
David Reich

@ DavidReich หาก SwiftUI อยู่ในรุ่นเบต้าฉันสามารถเข้าใจได้ว่าจะมีปัญหามากมาย ในการผลิตเครื่องมือพร้อมใช้งานสิ่งที่คาดหวังอย่างน้อยที่สุดก็คือมันใช้งานได้ มี "การอัปเดตจุด" ของ iOS และ macOS หลายครั้งตั้งแต่เปิดตัวครั้งแรกเมื่อปีที่แล้วดังนั้นข้อผิดพลาดที่เห็นได้ชัดเช่นนี้หรือ "การข้ามรายการชื่อเรื่องกระโดด" ควรจะถูกแบนนานแล้ว ฉันพยายามใช้มันเพื่อแอพที่ใช้งานจริง แต่ต้องกลับไปที่ UIKIT เพื่อให้ได้ผลลัพธ์ที่ดี
GJ Nilsen

3
[อัพเดท] 12 ก.พ. 2020 - ฉันตรวจสอบปัญหานี้ใน Xcode 11.4 เบต้าแล้วและพบว่าปัญหานี้ได้รับการแก้ไขแล้ว
Sagun Raj Lage

5

Simulator 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 ทำงานได้มากกว่าหนึ่งครั้ง ไม่มีสิ่งใดแก้ไขได้ในเครื่องมือจำลอง แต่วิธีการที่คล้ายกับวิธีนี้ที่ใช้กับอุปกรณ์ทางกายภาพของฉันคือการตั้งค่า onDisappear บน View2 ซึ่งรีเซ็ตการตั้งค่าสถานะที่ใช้งานอยู่ เป็นวิธีแก้ปัญหาที่ผิดพลาดเล็กน้อยสำหรับ Xcode bug (เพราะคุณไม่ต้องผูกกับสถานะที่ View2 ไม่ควรรู้) NavigationViewDemo_View2 (). onDisappear (ดำเนินการ: {self.isActive = false})
SJoshi

@SJoshi ฉันได้รับ แต่onDisappear จะถูกเรียกหลังจากisActiveเป็นเท็จดังนั้น NavigationView จะทำงานไม่ถูกต้อง เป็นโซลูชันชั่วคราวสำหรับอีมูเลเตอร์เท่านั้นเนื่องจาก NavigationView ทำงานได้อย่างถูกต้องบนอุปกรณ์ ในเวอร์ชันก่อนหน้าของเลียนแบบ NavigationView ทำงานฉันหวังว่ามันจะได้รับการแก้ไขในโปรแกรมจำลองอนาคต
Victor Kushnerov

แปลกรหัสนี้ใช้ไม่ได้กับเครื่องมือจำลองหรืออุปกรณ์ทางกายภาพของฉัน - โซลูชันที่ฉันเสนอจะรีเซ็ตการตั้งค่าสถานะที่ใช้งานอยู่เมื่อมีการยกเลิกมุมมองรายละเอียดและอนุญาตให้อุปกรณ์ทางกายภาพทำงานได้ Word บนถนนคือ Xcode 13.4 แก้ไขปัญหานี้
SJoshi

ฉันทดสอบกับเครื่องจำลอง 11.3.1 ใช้งานได้อย่างมีเสน่ห์ คุณเห็น 3 การเริ่มฉันคิดว่าคนอื่นช่วยด้วย
Victor Kushnerov

ใช่ฉันเองทดสอบด้วย - โดยใช้ iPhone หลายเครื่อง ทดสอบด้วยอุปกรณ์ทางกายภาพ 4 เครื่อง - ไม่มีโชค ข้อผิดพลาดนี้เป็นสิ่งที่ไร้สาระอย่างแน่นอน ฉันลงเอยด้วยการทำวิธีแก้ปัญหาไร้สาระบางอย่างในระหว่างนี้สำหรับการจำลอง
SJoshi

3

สันนิษฐานนี้จะได้รับการแก้ไขเมื่อแอปเปิ้ลช่วยแก้ไขข้อผิดพลาดที่เกี่ยวข้องที่ป้องกัน 13.3 จากการถูกเลือกเป็นเป้าหมายการใช้งาน

ฉันประสบปัญหาเช่นเดียวกับคนอื่น ๆ ปัญหานี้มีอยู่ในเครื่องมือจำลองและดูตัวอย่างการทำงาน 13.2 แต่ได้รับการแก้ไขเมื่อปรับใช้กับอุปกรณ์ของฉันเองที่ใช้งาน 13.3


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.