NavigationLink — qué es, botón de transición en SwiftUI

Autor: IT Sectr Publicado: 2026-06-25 Tiempo de lectura: 6 min

NavigationLink es un elemento de control en SwiftUI diseñado para la transición a otra pantalla en NavigationStack o NavigationView. Según Apple Developer Documentation, 2024, NavigationLink crea un botón que, al presionarlo, coloca la View de destino en la pila de navegación. En iOS 16+ se recomienda usar NavigationLink con value y NavigationDestination en lugar de con destination directamente para evitar la inicialización prematura de las Views de destino.

Puntos clave

  • NavigationLink — un botón para navegar a otra pantalla en SwiftUI
  • Dos formas — con destination:label: y con value:label:
  • Forma value recomendada en iOS 16+ (NavigationStack)
  • Forma destination causa inicialización prematura de View
  • Flecha automática de divulgación en List

NavigationLink es una View que inicia una transición de navegación al presionarla. Dentro de NavigationStack, al presionar NavigationLink coloca la pantalla de destino en la pila y muestra el botón de Atrás del sistema. NavigationLink existe desde iOS 13 y es el método principal de navegación del usuario en SwiftUI.

NavigationLink no hereda de UIButton — es una View de SwiftUI que se adapta automáticamente al contexto. Dentro de List, NavigationLink se muestra con un indicador de divulgación. Fuera de una lista, NavigationLink se comporta como un botón normal pero con comportamiento de navegación.

Según SwiftUI Lab (2024), NavigationLink es una de las Views más usadas en aplicaciones SwiftUI, solo superada por Text, Image y VStack. Comprender las diferencias entre las formas de inicialización es crítico para el rendimiento y el comportamiento predecible de la navegación.

Cómo funciona NavigationLink internamente

Al presionarlo, NavigationLink agrega un valor (o destination) a la pila de navegación asociada con el NavigationStack o NavigationView más cercano. SwiftUI usa EnvironmentValue para pasar la ruta de navegación a través de la jerarquía de Views. NavigationLink lee esta ruta del Environment y la modifica al presionarlo.

NavigationLink tiene dos formas principales: con destination (especificando directamente la View de destino) y con value (valor para NavigationDestination). La elección de la forma depende de la versión de iOS y la arquitectura de navegación.

FormaInicializadoriOS 13–15iOS 16+
DestinationNavigationLink(destination:label:)RecomendadaNo recomendada
ValueNavigationLink(value:label:)No disponibleRecomendada
IsActiveNavigationLink(isActive:destination:label:)Navegación programáticaNo recomendada

Forma destination (iOS 13+): NavigationLink(destination: DetailView(), label: { Text("Open") }). Esta forma crea DetailView inmediatamente al renderizar NavigationLink, incluso si el usuario no ha hecho clic en el enlace. Esto provoca una inicialización prematura de View y posibles problemas de rendimiento si la View de destino realiza operaciones pesadas en su inicializador.

Forma value (iOS 16+): NavigationLink(value: "detail_42", label: { Text("Open") }). La View de destino se crea solo cuando se presiona el enlace, cuando SwiftUI encuentra el .navigationDestination correspondiente. Esto evita la inicialización prematura y hace que la navegación sea más predecible.

NavigationLink con NavigationStack en iOS 16+ requiere cambiar a la forma value. Usted define un tipo de datos para la navegación (String, Int, enum Route) y registra el destination a través de .navigationDestination. NavigationLink solo coloca el valor en la pila, y SwiftUI crea la View de destino al presionar.

swift
struct CatalogView: View {
    let categories: [String]

    var body: some View {
        List(categories, id: \.self) { category in
            NavigationLink(value: category) {
                Text(category)
            }
        }
        .navigationDestination(for: String.self) { category in
            CategoryView(name: category)
        }
    }
}

// Programmatic navigation:
struct DeepLinkView: View {
    @State private var path: [AppRoute] = []

    var body: some View {
        NavigationStack(path: $path) {
            HomeView()
                .navigationDestination(for: AppRoute.self) { route in
                    switch route {
                    case .detail(let id): DetailView(id: id)
                    case .settings: SettingsView()
                    }
                }
                .toolbar {
                    Button("Open Settings") {
                        path.append(AppRoute.settings)
                    }
                }
        }
    }
}

Navegación programática: agregar un valor a la ruta (mediante path.append) equivale a presionar un NavigationLink con el mismo valor. Esto permite implementar navegación desde ViewModel, Coordinator o en respuesta a notificaciones push.

Forma IsActive (NavigationLink(isActive:destination:label:)) está disponible por compatibilidad, pero no se recomienda en iOS 16+. Use la forma value con Binding a un array de ruta o NavigationPath.

NavigationLink en List muestra automáticamente un indicador de divulgación (chevron) en el lado derecho de la fila, señalando al usuario que presionar lo llevará a otra pantalla. List gestiona la visualización de la flecha automáticamente — a diferencia de un NavigationLink normal fuera de una lista, donde no hay flecha.

Con iOS 16, List con NavigationLink usa automáticamente la forma value dentro de List(data:rowContent:). Al usar ForEach dentro de List, el indicador de divulgación también se agrega automáticamente. Este comportamiento no se puede desactivar mediante modificadores — solo reemplazar NavigationLink con Button puede eliminar la flecha.

Problema con la forma destination en List: si usa NavigationLink(destination:label:) dentro de List, todas las Views de destino se crean inmediatamente al cargar la lista, independientemente de si el usuario hizo clic en el enlace o no. Para listas con un gran número de filas, esto puede ralentizar significativamente la carga inicial y aumentar el consumo de memoria. La forma value con NavigationStack resuelve este problema.

Según WWDC 2022 (Session 10054), Apple recomienda usar NavigationStack y la forma value de NavigationLink para proyectos nuevos. Esto es especialmente importante para List con datos dinámicos, donde el número de filas puede ser grande.

Patrón 1: Apariencia personalizada de NavigationLink. NavigationLink acepta cualquier View como label, lo que permite crear diseños personalizados para el enlace. Dentro de List, esto es especialmente conveniente — obtiene un indicador de divulgación automático al usar NavigationLink.

swift
NavigationLink(value: ProductRoute.detail(product)) {
    HStack {
        AsyncImage(url: product.imageURL)
            .frame(width: 60, height: 60)
        VStack(alignment: .leading) {
            Text(product.name).font(.headline)
            Text(product.price) .foregroundColor(.secondary)
        }
    }
    .padding(8)
}

Patrón 2: NavigationLink sin flecha (botón personalizado). Si no necesita un indicador de divulgación, use Button para navegación programática: path.append(value). Esto es útil para elementos de interfaz personalizados donde NavigationLink se ve antinatural.

Patrón 3: Navegación condicional. Puede bloquear NavigationLink usando un destination vacío o no agregando .navigationDestination para ciertos valores. La navegación programática a través de path permite verificar condiciones antes de agregar un valor.

Según Hacking with Swift (2024), la mayoría de los problemas con NavigationLink están relacionados con el uso de la forma destination en proyectos antiguos. Al migrar a NavigationStack, reemplace todos los NavigationLink(destination:label:) con NavigationLink(value:label:) y agregue .navigationDestination en el nivel raíz.

Preguntas frecuentes

¿Qué es NavigationLink en SwiftUI?

NavigationLink es una View para la transición a otra pantalla en SwiftUI. Al presionarlo, coloca la pantalla de destino en la pila de navegación NavigationStack o NavigationView. Admite dos formas: con destination (View de destino) y con value (valor de enrutamiento).

¿Qué forma de NavigationLink es mejor: destination o value?

Forma value (iOS 16+) es preferible: la View de destino se crea solo al presionar, no al renderizar el enlace. La forma destination crea la View inmediatamente, lo que puede causar problemas de rendimiento. Para proyectos con iOS 16+, use value + NavigationDestination.

¿Por qué NavigationLink crea una flecha en List?

SwiftUI agrega automáticamente un indicador de divulgación (flecha) a NavigationLink dentro de List, señalando la posibilidad de navegación. Este comportamiento no se puede desactivar. Si no se necesita la flecha, use Button con navegación programática mediante path.append().

¿Cómo hacer navegación programática con NavigationLink?

Use NavigationStack con un Binding a la ruta y agregue valores mediante path.append(value). Esto equivale a presionar un NavigationLink con el mismo value. La navegación programática permite implementar deeplinks, notificaciones push y el patrón Coordinator.

¿Afecta NavigationLink al rendimiento?

La forma destination puede afectar el rendimiento si las Views de destino realizan operaciones pesadas en su inicializador — todos los destination se crean al renderizar la lista. La forma value con NavigationStack resuelve este problema creando Views solo al presionar. Para listas con 50+ filas, la diferencia es significativa.

Resumen

  • NavigationLink — un botón para transiciones de navegación entre pantallas de SwiftUI
  • Forma value recomendada en iOS 16+ con NavigationStack
  • Forma destination crea View prematuramente — evítela para listas grandes
  • Indicador de divulgación — flecha automática en List (no se puede desactivar)
  • Navegación programática mediante path.append() para deeplinks y Coordinator
  • NavigationDestination registra pantallas de destino por tipos de datos
  • Forma IsActive — obsoleta, use la forma value en iOS 16+

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también