Alt işlev üst öğeden nasıl çalıştırılır?

0

Soru

Üst görünümdeki düğmeye basarak childFunction () demo ChildView çağırmak istiyorum.

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

Güncelleme: Teşekkürler @ RajaKishan, işe yarıyor, ama yinelemeli olarak da çalışmasına ihtiyacım var

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

Belki de en iyi görünen örnek değildir, ancak soru, kullanıcı ilgili çocuğu ziyaret ettikten sonra düğmenin alt öğesinin işlevini çalıştırmaya nasıl zorlanacağıdır.

Örneğin, kullanıcı düğmeye bastığında başlangıçta "Bu görünüm Üst Düzeydir"yazdırır. Kullanıcı child1'e geldikten sonra düğmeye basıldığında "Bu görünüm Child1'dir" gibi yazdırılmalıdır. Bu nedenle, düğmenin çalıştığı işleve son alt öğeden başvurulmalıdır.

Güncelleme: Sonunda bu çözümü yazdım.

Güncelleme: Açıklama yapmamı isteyen geri bildirim aldım. Sorun değil. Birileri yardımcı olur umarım.:)

Açıklama: Tüm kodu içine almadım, sadece basit bir örnek kullandım. Ancak, ağaç benzeri oluşturulmuş bir menü uygulamamda buna ihtiyacım vardı: menüdeki her öğenin çocukları olduğunda veya olmadığında. Üst nesneye basıldığında, kullanıcı alt nesnelere girer. Ve burada bir alt nesneden ebeveyne geri dönebilmem gerekiyordu, ancak bu görevden alma işlevini üst nesneden çağırdım. Bunun için aşağıdaki kodu kullandım ve bu işlevi her bir üst nesneye yönlendirdim:

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

En iyi cevabı

1

ChildView için bir nesne oluşturabilirsiniz.

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


DÜZENLEME: Liste için modelin dizisini kullanabilir ve hedef işlevi dizine göre çağırabilirsiniz.

İşte basit çocuk-ebeveyn örneği.

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
}

Not: Satırın alt işlevi çağırması için dizin oluşturmanız gerekir.

2021-11-24 07:34:52

Merhaba. Cevap için teşekkürler. İşe yarıyor. Ancak, ContentView gezinme bağlantıları aracılığıyla ContentView childs oluşturulduğunda özyinelemeli Görünüm yapısı söz konusu olduğunda, Değer türü yinelemeli olarak içeren depolanmış bir özelliğe sahip olamayacağından bu nasıl çözülebilir ?
Degtiarev Aleksei

@ DegtiarevAleksei sorunuza bir örnek ekleyebilir misiniz?
Raja Kishan

Soru güncellendi
Degtiarev Aleksei

@ DegtiarevAleksei Düzenleme bölümünü ekledim. Bu yararlı olabilir.
Raja Kishan

Cevap için teşekkür ederim, ancak derledikten sonra düğme her zaman "Bu görünüm Child2" döndürür.
Degtiarev Aleksei

@DegtiarevAleksei Bunun nedeni, düğme eyleminde dizin 1'i (arrData[1]) ayarladım. notumu oku.
Raja Kishan

Bu beklendiği gibi çalışmayabilir, çünkü Swiftui'deki görünümler yapılardır; bu, değere göre geçirildikleri ve böylece her dolaşımda kopyalandıkları anlamına gelir. Sonunda, birden çok, farklı ile sonuçlanırsınız ChildView bu nedenle, alt işlevi beklediğinizden farklı bir görünümde çağırabilirsiniz.
Cristik

@Cristik evet, bunun her alt görünüm çağrısı için birden çok örnek oluşturmanın doğru olduğunu düşünüyorum. Çünkü her olay için farklı davranır.
Raja Kishan

Diğer dillerde

Bu sayfa diğer dillerde

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