Como executar criança a função do pai?

0

Pergunta

Eu quero chamar a childFunction() demonstração ChildView pressionando o botão na view pai.

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

Atualização: Obrigado @RajaKishan, ele funciona, mas eu preciso trabalhar também recursivamente

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

Talvez não é o melhor exemplo, mas a questão é, como forçar o botão para executar a função de seu filho depois que o usuário visitou o filho correspondentes.

Como, no início quando o usuário pressiona o botão imprime "Este ponto de vista é Pai". Depois que o usuário se trata de child1 premir o botão deve imprimir "Este ponto de vista é Child1" como assim por diante. Assim, a função que o botão é executado deve ser referenciado a partir do último filho.

Atualização: No final, eu escrevi esta solução.

Atualização: Recebi feedback, pedindo-me esclarecimentos. Não há problema. Eu espero que ele vai ajudar alguém.:)

Esclarecimento: Eu não coloque todo o código, usei apenas um exemplo simples. Mas eu precisava disso em minha implementação de uma árvore gerada menu: quando cada item do menu tem ou não tem filhos. Pressionando o principal objeto de usuário vem em objetos filho. E aqui eu necessárias para ser capaz de voltar de um objeto filho para com o pai, mas chamar esta função de dispensar do objeto pai. Para isso eu usei o seguinte código e, que se refere a esta função, para cada objeto pai:

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

Melhor resposta

1

Você pode criar um objeto para um 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")
        })
    }
}


EDITAR : Para a lista, você pode usar a matriz do modelo e chamar o destino de função de índice.

Aqui é o simples filho-pai, exemplo.

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
}

Nota: Você precisa de índice para a linha de chamada de função criança.

2021-11-24 07:34:52

Olá. Obrigado pela resposta. Ele funciona. Mas, no caso da recursiva Vista de estrutura quando exibiçãode conteúdo tem exibiçãode conteúdo criança criada através NavigationLinks, como isso poderia ser resolvido como o tipo de Valor não podem ter uma propriedade armazenados que recursivamente o contém ?
Degtiarev Aleksei

@DegtiarevAleksei pode você por favor, adicione um exemplo para a sua pergunta?
Raja Kishan

Actualizado a questão
Degtiarev Aleksei

@DegtiarevAleksei eu adicionei a editar a parte. Isso pode ser útil.
Raja Kishan

Obrigado pela resposta, mas depois de ter compilado o botão sempre retorna "Essa visão é Filho2"
Degtiarev Aleksei

@DegtiarevAleksei é porque eu tenho um conjunto de índice 1 (arrData[1]) no botão de ação. leia a minha nota.
Raja Kishan

Isto pode não funcionar como esperado porque as vistas em SwiftUI são estruturas, o que significa que eles são passados por valor, assim, copiados de cada vez que são divulgadas. No final, você acaba com múltiplas e distintas ChildView instâncias, portanto, você pode acabar chamando a criança de função em outro modo de exibição que você espera.
Cristik

@Cristik sim, eu acho que isto é o certo para criar várias instâncias de cada criança chamada vista. Porque ele se comporta de forma diferente para cada ocorrência.
Raja Kishan

Em outros idiomas

Esta página está em outros idiomas

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