No sé cómo leer una propiedad que está en una estructura de una clase que es un objeto observable.
Contexto:
Estoy tratando de crear una aplicación que consta de 2 vistas:
- un calendario personalizado;
- una ventana emergente con un encabezado 'Daily Joke', fecha con formato 'MM-dd-yyyy' y un texto de broma que se obtiene de Firebase usando id. Cuando el usuario hace clic en una fecha en el calendario, aparece la ventana emergente y muestra el chiste para una fecha seleccionada.
El problema es que la propiedad 'currentDate' (contiene el valor de la fecha seleccionada) a la que hago referencia en el ObservableObject de la clase 'getJoke' no se actualizará cuando el usuario seleccione una fecha diferente. Siempre obtiene el chiste en la fecha de hoy y no en la que el usuario ha seleccionado.
Aquí está el código de:
- el calendario personalizado (la fecha seleccionada se mantiene en la propiedad 'currentDate')
import SwiftUI
import grpc
struct CustomDatePicker: View {
@State var currentDate: Date
@State var dailyJokePopUp = false
//some code here
// When the user selects the date, currentDate property changes to the selected date
.onTapGesture {
currentDate = value.date
}
// Getting selected day for displaying in dailyJokePopUp
func getCurrentDay()->String{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
let date = dateFormatter.string(from: currentDate)
return date
}
- la clase que es un @ObservableObject (lo uso para agregar un oyente a Firebase para buscar el texto de broma por su id)
class getJoke: ObservableObject {
@Published var data = [JokeX]()
@Published var noData = false
@Published var currentDate = Date()
//some code here including adding SnapShotListener
let callCDP = CustomDatePicker(currentDate: currentDate).getCurrentDay()
if id == callCDP {
self.data.append(joke_text_imported)}
}
}
}
}
- la ventana emergente (llamo al resultado de @ObservableObject para mostrar el texto obtenido de Firebase)
import SwiftUI
struct dailyJokePopUp: View {
@Binding var show: Bool
@ObservedObject var Jokes = getJoke()
var currentDate: Date = Date()
//some code here
ForEach(self.Jokes.data){i in
Text(i.joke_text)
}
//some code here
}
Puedo sospechar que algo anda mal con la forma en que declaro las propiedades. Probé varios contenedores (@Binding, @StateObject), pero me confundí y no funcionó. Espero que alguien pueda ser lo suficientemente amable para ayudarme a resolver el problema.
Solución del problema
Ver modelo
class getJoke: ObservableObject {
@Published var currentDate = Date()
}
Ver que puede cambiar el paso de datos
struct CustomDatePicker: View {
@Binding var currentDate: Date
var body: some View{
VStack {
DatePicker(selection: $currentDate, displayedComponents:.date){
Text("Select your date")
}
.datePickerStyle(.compact)
}
}
}
Y poner todo junto
struct ContentView: View {
@StateObject var vm = getJoke()
var body: some View {
VStack(spacing: 40) {
CustomDatePicker(currentDate: $vm.currentDate)
Button {
print(vm.currentDate)
} label: {
Text("Show selected date")
}
}
}
}
No hay comentarios.:
Publicar un comentario