Luego de mirar en diversos repositorios y páginas webs finalmente hemos dado con la solución que te compartiremos más adelante.
Solución:
La forma en que Apple lo hace es usando constructores de funciones. Hay uno predefinido llamado ViewBuilder
. Conviértalo en el último argumento, o el único argumento, de su init
método para MenuItem
al igual que:
..., @ViewBuilder builder: @escaping () -> Content)
Asígnalo a una propiedad definida algo como esto:
let viewBuilder: () -> Content
Luego, donde desee mostrar las vistas pasadas, simplemente llame a la función de esta manera:
HStack
viewBuilder()
Podrá usar su nueva vista de esta manera:
MenuItem
Image("myImage")
Text("My Text")
Esto le permitirá pasar hasta 10 vistas y usar if
condiciones, etc. aunque si desea que sea más restrictivo, tendrá que definir su propio generador de funciones. No lo he hecho, así que tendrás que buscarlo en Google.
Para resumir todo lo que leí aquí y la solución que funcionó para mí y en iOS14:
struct ContainerView: View
let content: Content
init(@ViewBuilder content: @escaping () -> Content)
self.content = content()
var body: some View
content
Esto no sólo le permite simplificar View
s adentro, pero también, gracias a @ViewBuilder
usar if-else
y switch-case
bloques:
struct SimpleView: View
var body: some View
ContainerView
Text("SimpleView Text")
struct IfElseView: View
var flag = true
var body: some View
ContainerView
if flag
Text("True text")
else
Text("False text")
struct SwitchCaseView: View
var condition = 1
var body: some View
ContainerView
switch condition
case 1:
Text("One")
case 2:
Text("Two")
default:
Text("Default")
Prima:
Si desea un contenedor codicioso, que reclame todo el espacio posible (a diferencia del contenedor anterior, que solo reclama el espacio necesario para sus subvistas), aquí está:
struct GreedyContainerView: View
let content: Content
init(@ViewBuilder content: @escaping () -> Content)
self.content = content()
var body: some View
Color.clear
.overlay(content)
Debe hacer que el parámetro genérico sea parte de MenuItem
:
struct MenuItem: View
private var destinationView: Content
init(destinationView: Content)
self.destinationView = destinationView
var body : some View
// ...
Comentarios y valoraciones del tutorial
Nos puedes defender nuestra tarea poniendo un comentario y dejando una valoración te estamos eternamente agradecidos.