Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Backported SwiftUI navigation APIs introduced in WWDC22

License

NotificationsYou must be signed in to change notification settings

yapstudios/NavigationBackport

 
 

Repository files navigation

This package uses the navigation APIs available in older SwiftUI versions (such asNavigationView andNavigationLink) to recreate the newNavigationStack APIs introduced in WWDC22, so that you can start targeting those APIs on older versions of iOS, tvOS, macOS and watchOS. When running on an OS version that supportsNavigationStack,NavigationStack will be used under the hood.

NavigationStack ->NBNavigationStack

NavigationLink ->NBNavigationLink

NavigationPath ->NBNavigationPath

navigationDestination ->nbNavigationDestination

NavigationPath.CodableRepresentation ->NBNavigationPath.CodableRepresentation

You can migrate to these APIs now, and when you eventually bump your deployment target, you can remove this library and easily migrate to its SwiftUI equivalent.NavigationStack's full API is replicated, so you can initialise anNBNavigationStack with a binding to anArray, with a binding to anNBNavigationPath binding, or with no binding at all.

Example

Click to expand an example
import NavigationBackportimport SwiftUIstructContentView:View{@Statevarpath=NBNavigationPath()varbody:someView{NBNavigationStack(path: $path){HomeView().nbNavigationDestination(for:NumberList.self, destination:{ numberListinNumberListView(numberList: numberList)}).nbNavigationDestination(for:Int.self, destination:{ numberinNumberView(number: number)}).nbNavigationDestination(for:EmojiVisualisation.self, destination:{ visualisationinEmojiView(visualisation: visualisation)})}}}structHomeView:View{varbody:someView{VStack(spacing:8){NBNavigationLink(value:NumberList(range:0..<100), label:{Text("Pick a number")})}.navigationTitle("Home")}}structNumberList:Hashable{letrange:Range<Int>}structNumberListView:View{letnumberList:NumberListvarbody:someView{List{ForEach(numberList.range, id: \.self){ numberinNBNavigationLink("\(number)", value: number)}}.navigationTitle("List")}}structNumberView:View{@EnvironmentObjectvarnavigator:PathNavigatorletnumber:Intvarbody:someView{VStack(spacing:8){Text("\(number)")NBNavigationLink(        value: number+1,        label:{Text("Show next number")})NBNavigationLink(        value:EmojiVisualisation(emoji:"🐑", count: number),        label:{Text("Visualise with sheep")})Button("Go back to root", action:{ navigator.popToRoot()})}.navigationTitle("\(number)")}}structEmojiVisualisation:Hashable{letemoji:Stringletcount:Intvartext:String{Array(repeating: emoji, count: count).joined()}}structEmojiView:View{letvisualisation:EmojiVisualisationvarbody:someView{Text(visualisation.text).navigationTitle("Visualise\(visualisation.count)")}}

Additional features

As well as replicating the standard features of the newNavigationStack APIs, some helpful utilities have also been added.

Navigator

ANavigator object is available through the environment, giving access to the current navigation path. The navigator can be accessed via the environment, e.g. for a NBNavigationPath-backed stack:

@EnvironmentObjectvarnavigator:PathNavigator

Or for a stack backed by an Array, e.g.[ScreenType]:

@EnvironmentObjectvarnavigator:Navigator<ScreenType>

As well as allowing you to inspect the path elements, the navigator can be used to push new screens, pop, pop to a specific screen or pop to the root.

Navigation functions

Whether interacting with anArray, anNBNavigationPath, or aNavigator, a number of utility functions are available for easier navigation, such as:

path.push(Profile(name:"John"))path.pop()path.popToRoot()path.popTo(Profile.self)

Note that, if you want to use these methods on anArray, ensure theArray'sElement conforms toNBScreen, a protocol that inherits from Hashable without adding any additional requirements. This avoids polluting all arrays with APIs specific to navigation.

Deep-linking

BeforeNavigationStack, SwiftUI did not support pushing more than one screen in a single state update, e.g. when deep-linking to a screen multiple layers deep in a navigation hierarchy.NavigationBackport works around this limitation: you can make any such path changes, and the library will, behind the scenes, break down the larger update into a series of smaller updates that SwiftUI supports if necessary, with delays in between. For example, the following code that pushes three screens in one state update will push the screens one by one if needed:

  path.append(Screen.orders)  path.append(Screen.editOrder(id: id))  path.append(Screen.confirmChanges(orderId: id))

This only happens when necessary: on versions of SwiftUI that supportNavigationStack, all three screens will be pushed successfully in one update.

Support for iOS/tvOS 13

This library targets iOS/tvOS versions 14 and above, since it usesStateObject, which is unavailable on iOS/tvOS 13. However, there is anios13 branch, which usesSwiftUIBackports' backported StateObject, so that it works on iOS/tvOS 13 too.

About

Backported SwiftUI navigation APIs introduced in WWDC22

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Swift99.0%
  • Shell1.0%

[8]ページ先頭

©2009-2025 Movatter.jp