[SUI] Barra lateral (Sidebar)

Published: (February 11, 2026 at 11:24 AM EST)
2 min read
Source: Dev.to

Source: Dev.to

Descripción

En iPadOS y macOS se pueden presentar las pestañas en una barra lateral modificando el TabView con tabViewStyle(_:), usando el valor sidebarAdaptable.

Dentro del sidebar se pueden separar las pestañas en secciones con TabSection. Si quedan pestañas aisladas, estas aparecerán encima de todas las secciones.

Se puede configurar un encabezado al sidebar con tabViewSidebarHeader(content:) y un pie de página con tabViewSidebarFooter(content:). Además, puede haber un único botón en la parte inferior del sidebar, que se agrega con tabViewSidebarBottomBar(content:).

Al usar TabContent.badge(_:), el número aparecerá al lado derecho del nombre de la pestaña.

Cuando se selecciona un Tab, la barra lateral se cierra y el tab queda seleccionado en la barra superior (como si se usara tabBarOnly). Si el Tab estaba dentro de un TabSection, también se seleccionará la sección correspondiente.

Al cambiar entre Tabs de distintas secciones, cada sección conserva el estado del último Tab elegido.

Ejemplo de código

enum TabFeature {
    case home, remove, trips, account, send
}

struct ContentView: View {

    @State private var selectedTab = TabFeature.home
    @State private var newTrips = 2

    var body: some View {
        TabView(selection: $selectedTab) {
            TabSection("Sección con nombre largo 1") {
                Tab("Tab 1", systemImage: "house", value: TabFeature.home) {
                    Text("Contenido Tab 1")
                        .background(Color.blue.opacity(0.7))
                }
                Tab("Tab 2", systemImage: "trash", value: TabFeature.remove) {
                    Text("Contenido Tab 2")
                        .background(Color.red.opacity(0.7))
                }
            }
            TabSection("Sección 2") {
                Tab("Tab 3", systemImage: "airplane", value: TabFeature.trips) {
                    Text("Contenido Tab 3")
                        .background(Color.blue.opacity(0.7))
                        .onAppear {
                            newTrips = 0
                        }
                }
                .badge(newTrips)

                Tab("Tab 4", systemImage: "person", value: TabFeature.account) {
                    Text("Contenido Tab 4")
                        .background(Color.red.opacity(0.7))
                }
            }

            Tab("Tab 6", systemImage: "message", value: TabFeature.send) {
                Text("Contenido Tab 5")
                    .background(Color.red.opacity(0.7))
            }
        }
        .tabViewSidebarHeader {
            Label("Este es el header", systemImage: "gear")
        }
        .tabViewSidebarBottomBar {
            Button("Acción 1") {
                newTrips += 1
            }
            Button("Acción 2 NO VISIBLE") {
                print("Hago algo")
            }
        }
        .tabViewSidebarFooter {
            Label("Este es el footer", systemImage: "cloud")
        }
        .tabViewStyle(.sidebarAdaptable)
    }
}

Imágenes

Sidebar example 1

Sidebar example 2

Bibliografía

0 views
Back to Blog

Related posts

Read more »