Advanced navigation app
In this example, we are going to create an App that allows users to long press on the map to add a destination to request routes and display the routes on the map, this app also enables route selection from alternative routes, lastly, users can start navigation by tapping the “Start” button, then the app will present the NavigationViewController to begin turn-by-turn navigation.
![documentation image](https://static.nextbillion.io/docs-next/docs/navigation/ios/advanced-navigation-app1.webp)
For all code examples, refer to Navigation Code Examples
AdvancedNavigationViewController view code
The code defines a custom view controller called AdvancedNavigationViewController that inherits from UIViewController and conforms to the NGLMapViewDelegate protocol. The purpose of this custom view controller is to implement an advanced navigation experience using NbmapNavigation, NbmapCoreNavigation, NbmapDirections, and Nbmap libraries.
-
Import statements: The necessary frameworks are imported at the beginning of the file.
-
navigationMapView: A property for the NavigationMapView instance. When its value is set, the old instance is removed from the view hierarchy, and the new one is inserted as a subview.
-
routes: An array of Route objects. When its value is set, the start button's state is updated accordingly, and the route, waypoints, and route duration symbols are shown on the navigation map view.
-
startButton: A UIButton that initiates navigation when tapped.
-
viewDidLoad(): This method sets up the view controller after the view is loaded. It creates a NavigationMapView, adds a long press gesture recognizer, sets up the start button, and calls view.setNeedsLayout() to invalidate the current layout of the receiver and trigger a layout update during the next update cycle.
-
setupStartButton(): This method configures the start button's appearance and adds a target to handle the button tap.
-
tappedButton(sender:): The action method for the start button tap. It initializes a NBNavigationService, sets up navigation options and a NavigationViewController, and then presents the navigation view controller.
-
didLongPress(tap:): The method that handles the long press gesture. It converts the tap location to coordinates and then adds a new destination based on the coordinates. It also makes a request for routes between the user's current location and the destination.
-
addNewDestinationIcon(coordinates:): This method adds a new destination annotation to the navigation map view.
-
requestRoutes(origin:destination:): This method requests routes between the given origin and destination using the specified options.
-
An extension of AdvancedNavigationViewController that conforms to the NavigationMapViewDelegate protocol. It contains the navigationMapView(_:didSelect:) delegate method to handle when the user selects a route from the displayed routes.
![ios-sdk-7](https://static.nextbillion.io/docs-next/docs/navigation/ios/advanced-navigation-app2.webp)