¿Cómo transferir datos entre pantallas en una aplicación de videojuegos?
En el desarrollo de aplicaciones, especialmente cuando hablamos de videojuegos, es crucial saber cómo compartir datos entre diferentes pantallas o vistas. La lógica detrás de la transferencia de datos garantiza que las experiencias del usuario sean coherentes y fluidas. En esta sección, exploraremos cómo se realiza esta tarea, partiendo de un archivo de juegos hasta llegar a una pantalla de reproducción de video.
¿Cómo activamos la vista del juego?
Para que al pulsar un botón se redirija a la siguiente pantalla de la aplicación, utilizamos una variable con el property wrapper @State de SwiftUI. Esta variable, llamada gameViewIsActive, indica cuando la pantalla del juego está activa:
@Stateprivatevar gameViewIsActive:Bool=false
Cuando la variable se establece en true, la aplicación entiende que debe mostrar la pantalla del juego correspondiente.
¿Cómo creamos el Navigation Link?
Un NavigationLink es fundamental para navegar entre vistas en SwiftUI. Para establecer un NavigationLink que conecte dos pantallas, como Games y GameView, sigue estos pasos:
Define el destino, que es la GameView.
Verifica si el link está activo utilizando la variable gameViewIsActive.
Añade un label para el NavigationLink, que en este caso podría ser una vista vacía o un texto temporal.
Aquí tienes un ejemplo de cómo se configura:
NavigationLink( destination:GameView(), isActive: $gameViewIsActive, label:{Text("Ir a vista de juego")})
¿Cómo definimos el destino en una nueva vista?
Crearemos una nueva vista suficientemente flexible para recibir y mostrar diversos datos relacionados con los videojuegos. Esta vista, denominada GameView, debe prepararse para manejar todos los datos pertinentes:
Crea una nueva vista GameView: Dentro de la carpeta de vistas, selecciona "New file", elige "SwiftUI view" y nómbrala adecuadamente.
Declara las variables: Estas incluirán el título del juego, una URL para el video, el estudio desarrollador, el año de publicación, la descripción, etiquetas y enlaces a imágenes.
A continuación, te muestro cómo puede verse la declaración de variables en GameView:
structGameView:View{var titulo:Stringvar url:Stringvar estudio:Stringvar anoPublicacion:Stringvar descripcion:Stringvar tags:[String]var imagenesURL:[String]var body:someView{Text("Detalles del juego")// Aquí se añadirán componentes visuales para mostrar la información del juego}}
¿Cómo integramos toda la información en GameView?
Una vez creada la estructura básica, es esencial pasarle la información desde la pantalla Games. Esto es posible mediante la creación de una instancia de GameView, a la cual se le asignan los valores correctos:
Cuando compilas esto, asegúrate de verificar que todos los argumentos estén bien escritos y de que el NavigationLink tenga definido correctamente el destino. La omisión de estos detalles puede causar errores.
Este enfoque te brinda la capacidad de transferir y gestionar datos efectivamente en tu aplicación, mejorando la experiencia del usuario y la consistencia entre las pantallas de la misma.
¿Alguien sabe por qué en iOS 15, no respeta el espaciado del VStack principal? Aquí la diferencia entre correr la app en iOS 14.5 y iOS 15:
Me pasa lo mismo pero aún no lo he podido solucionar :/
Me pasa exactamente lo mismo..
Para iOS16 en adelante, después de 1000 videos y fotos encontré la solución, y como casi siempre, es muy sencilla, en vez de botones hay que usar un NavigationLink(destination: label:) destination siendo nuestra vista de gameView donde ahi mismo le entregas el valor de las variables, y en label utilizamos los valores que utilizamos para los botones quedándote así
así no paso todas las variables, luego dentro del otro, solo hago referencia a esa var
struct PantallaViewJuego:View{// var gameVOFromPantallaJuegos : GameViewObject?vargameFrom:GameViewObject?// var url: String//// var title: String// var studio: String// var calification: String// var anoPublicacion: String// var description: String// var tags: [String]// var imgUrls: [String]varbody: some View{Text("Pantalla de juego: \(gameFrom!.title)")// Text("Pantalla de juego")}}
Para esta parte y tomando en cuenta lo anterior de las sugerencias hice algunas cosas.
Crear una estructura que sirva para almacenar los datos que se reciben del servidor.
Alguien sabe como resolver esta advertencia
'init(destination:isActive:label:)' was deprecated in iOS 16.0: use NavigationLink(value: label:), or navigationDestination(isPresented: destination:), inside a NavigationStack or NavigationSplitView
¿Los NavigationLink se pueden ponder en cualquier parte dentro del body? o puede tambien estar fuera o similar ?
Hola Duwal : ) Recuerda que al final solo tienes que regresar una vista, en este caso la variable Body, es por eso que ponerla adrentro es lo recomendado. Saludos!
Es mas, si te fijas, por ejemplo si dentro del body tiene un Stack, y pones el link fuera de ese, te genera cosas extrañas como otra vista o te duplica el icono en el tabbar, así que debe ingresarlo también dentro de ese Stack