ให้วิ่งเด็กคนฟังก์ชันจากผู้ปกครองหรือไม่?

0

คำถาม

ฉันอยากจะโทรหา childFunction()สาธิต ChildView ยๆโดยการกดที่ปุ่มที่พ่อแม่องมุมมอง

import SwiftUI

struct ChildView: View {
    
    func childFunction() {
        print("I am the child")
    }

    var body: some View {
      Text("I am the child")
    }
}

struct ContentView: View {
    var function: (() -> Void)?

    var body: some View {
        ChildView()
        
        Button(action: {
            self.function!()
        }, label: {
            Text("Button")
        })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

ปรับปรุง: ขอบคุณ@RajaKishan มันได้ผลแต่ฉันต้องการให้มันทำงานยัง recursively

import SwiftUI

struct ContentView: View {
    @State var text: String = "Parent"
    var isNavigationViewAvailable = true
    
    func function() {
        print("This view is \(text)")
    }
    
    var body: some View {
        
        VStack {
            if isNavigationViewAvailable  {
                Button(action: {
                    function()
                }, label: {
                    Text("Button")
                })
            }
           
            
            if isNavigationViewAvailable {
                NavigationView {
                    List {
                        NavigationLink("Child1") {
                            ContentView(text: "Child1", isNavigationViewAvailable: false)
                        }
                        NavigationLink("Child2") {
                            ContentView(text: "Child2", isNavigationViewAvailable: false)
                        }
                        NavigationLink("Child3") {
                            ContentView(text: "Child3", isNavigationViewAvailable: false)
                        }
                    }
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

บางทีอาจเป็นไม่ใช่ที่ดีที่สุดที่มองหาตัวอย่างเช่นแต่คำถามก็คือวิธีที่จะบังคับปุ่มต้องไปฟังก์ชันของมันเป็นลูกหลังจากใช้ไปเยี่ยมที่สัมพันธ์กันเด็กน้อย

เหมือนเริ่มต้นตอของผู้ใช้กดระเบิดมันอรอยนิ้วมือ"ของมุมมองนี้เป็นพ่อแม่". หลังจากของผู้ใช้มา child1 ปุ่มกดปุ่มควรจะพิมพ์"ของมุมมองนี้คือ Child1"อย่างที่แล้ว ดังนั้น,ฟังก์ชันที่ปุ่มวิ่งจะถูกอ้างอิงจากสุดท้ายเด็กน้อย

ปรับปรุง: ในที่สุดฉันเขียน นี้ คิดอะไรบางอย่างออก

ปรับปรุง: ฉันได้รับการแจ้งเตือนการเริ่มทำงานถามฉันเพื่อช่วยทำให้ชัดเจน. ไม่มีปัญหา ฉันหวังว่ามันจะช่วยใครบางคน:)

ช่วยทำให้ชัดเจน: ฉันไม่ได้ enclose ตลอดรหัสมันเคยง่ายๆตัวอย่าง แต่ฉันต้องการสิ่งนี้ในของฉัน implementation ของต้นไม้-เหมือนที่ถูกสร้างเมนู:เมื่อแต่ละรายการในเมนูมีหรือไม่มีมันเด็กแล้ว ต่อพ่อค้าของผู้ใช้มากไปเด็กวัตถุ. และตอนนี้ฉันต้องการที่จะสามารถกลับมาจากเด็กวัตถุยุดแม่ไว้ตั้งแต่ที่เส้นแบ่งเขตเมืองแต่เรียกมันไม่สนใจฟังก์ชันจากพ่อแม่เดาใจ เรื่องนี้ฉันเคยงทำตามรหัสและให้ใครๆเรียกฟังก์ชันนี้เพื่อกันและพ่อแม่วัตถุ:

@Environment(\.presentationMode) var presentationMode
 presentationMode.wrappedValue.dismiss()
ios swift swiftui
2021-11-24 05:44:05
1

คำตอบที่ดีที่สุด

1

คุณสามารถสร้างออบเจ็กต์สำหรับ ChildView.

struct ChildView: View {
 
    func childFunction() {
        print("I am the child")
    }
    
    var body: some View {
        Text("I am the child")
    }
}

struct ContentView: View {
    
    let childView = ChildView()
    
    var body: some View {
        childView
        Button(action: {
            childView.childFunction()
        }, label: {
            Text("Button")
        })
    }
}


แก้ไข :สำหรับรายการคุณสามารถใช้อาเรย์ของนางแบบและโทรเรียกฟังก์ชันปลายทางโดยดัชนี

ที่นี่คือที่ง่ายอย่างลูก-พ่อแม่ตัวอย่าง

struct ChildView: View {
    var text: String
    
    func childFunction() {
        print("This view is \(text)")
    }
    
    var body: some View {
        Text("I am the child")
    }
}



struct ContentView55: View {
    
    @State private var arrData = [Model(title: "Child1", destination: ChildView(text: "Child1")),
                                           Model(title: "Child2", destination: ChildView(text: "Child2")),
                                           Model(title: "Child3", destination: ChildView(text: "Child3"))]
    
    var body: some View {
        
        VStack {
            Button(action: {
                arrData[1].destination.childFunction()
            }, label: {
                Text("Button")
            })
            
            NavigationView {
                SwiftUI.List(arrData) {
                    NavigationLink($0.title, destination: $0.destination)
                }
            }
        }
    }
    
}
struct Model: Identifiable {
    var id = UUID()
    var title: String
    var destination: ChildView
}

ข้อควรจำ:คุณต้องดัชนีสำหรับคนแถวต้องโทรหาเด็กคนฟังก์ชัน.

2021-11-24 07:34:52

สวัสดีค่ะ ขอบคุณสำหรับคำตอบ มันได้ผล แต่ในกรณีของ recursive องมุมมอง struct ตอนที่ ContentView มี ContentView childs สร้างขึ้นมาผ่านทาง NavigationLinks ว่านี่อาจจะเป็นได้เหมือนค่าประเภทไม่สามารถมีทรัพย์สินที่ถูกจัดเก็บไว้ recursively มีมัน?
Degtiarev Aleksei

@DegtiarevAleksei คุณสามารถได้โปรดเพิ่มหนึ่งตัวอย่างของคุณคำถามเหรอ?
Raja Kishan

ปรับปรุงคำถาม
Degtiarev Aleksei

@DegtiarevAleksei ฉันต้องเพิ่มให้มีการแก้ไขส่วนหนึ่ง. นี่อาจจะช่วยได้มากเลย
Raja Kishan

ขอบคุณสำหรับคำตอบแต่หลังจากที่ฉันถูกคอมไพล์โดยใช้ปุ่มเสมอจะได้ค่า"ของมุมมองนี้คือ Child2"
Degtiarev Aleksei

@DegtiarevAleksei มันเป็นเพราะฉันต้องตั้งดัชนี 1(arrData[1])อยู่ในปุ่มการกระทำ. อ่านจดหมายของฉัน
Raja Kishan

นี่อาจจะไม่ได้ทำงานอย่างที่คาดหวังเพราะมุมมองใน SwiftUI เป็น structs ซึ่งหมายความว่าพวกเขาเป็นผ่านค่า,ดังนั้นคัดลอกทุกครั้งที่พวกเขาเป็น circulated. ในที่สุดเธอสิ้นสุดขึ้นกับหลาย,หารค่า ChildView โห,ดังนั้นคุณอาจจะโทรเรียกเด็กคนฟังก์ชันอยู่อีกมุมมองมากกว่าที่คุณคาดหวังนะ
Cristik

@Cristik ใช่ฉันคิดว่าเรื่องนี้ถูกต้องแล้วใช่ไหมเพื่อสร้างประมวลผลได้หลายตัวสำหรับเด็กแต่ละคมุมมองโทรมา เพราะมัน behaves ต่างออกสำหรับแต่ละการเกิดขึ้นอีก.
Raja Kishan

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่