Tenho uma visualização swiftUI que é apresentada usando um hostingController:
let hostingController = UIHostingController(rootView: FirstView)
someVC.present(hostingController, animated: true)
O FirstView, por sua vez, apresenta uma segunda visualização SwiftUI usando .sheet(IsPresented com um booleano para determinar se ela deve ser exibida da seguinte maneira:
struct FirstView: View {
@Environment(\.presentationMode) var presentationMode
@State var showSecondView = false
//change showSecondView to true so it displays as a sheet
.sheet(isPresented: $showSecondView) {
SecondView()
}
}
No SecondView, tenho um botão que gostaria de usar para descartar tanto o SecondView quanto o FirstView. Ele descarta o SecondView, mas não consigo descobrir como descartar o FirstView também, já que o FirstView foi apresentado em um controlador de hospedagem que não usava um booleano.
Se o SecondView fosse, digamos, um Alerta dentro do First View, então eu poderia usar a variável de ambiente presentationMode para descartar, entretanto, essa variável não parece ser acessível no SecondView.
struct SecondView: View {
@Environment(\.dismiss) var dismiss
Button("OK") {
//THIS DOES NOT WORK BECAUSE presentationMode is out of scope
presentationMode.wrappedValue.dismiss()
dismiss()//
}
}
Como posso descartar não apenas a planilha atual (ou Segunda), mas também a visualização de apresentação (ou Primeira visualização) que foi apresentada em um HostingController.
Agradecemos antecipadamente por quaisquer sugestões.
Às vezes você passaria por um fechamento de ação, por exemplo
E às vezes o fechamento contém alguns dados que você deseja passar de volta, por exemplo
Você pode usar a mesma técnica para retornar ao UIKit ao iniciar a visualização raiz do controlador de hospedagem.
O SecondView é criado como uma planilha de visualização do SwiftUI, ele é gerenciado internamente pelo SwiftUI e pode ser descartado usando @Environment(\.dismiss).
Mas o FirstView é hospedado via UIKit (UIHostingController), então ele deve ser descartado via UIKit (someVC.dismiss(...)), o que não pode ser feito automaticamente de dentro de uma visualização SwiftUI profundamente aninhada sem uma ponte.
Aqui vai uma sugestão:
Vamos criar um ObservableObject para que possamos usá-lo com uma abordagem semelhante de gerenciamento de objetos de ambiente:
Adicione isso à visualização que será adicionada ao UIHostingController:
Faça uma referência ao objeto de ambiente e execute o método dismiss onde desejar: