• Stars
    star
    1,654
  • Rank 27,194 (Top 0.6 %)
  • Language
    Swift
  • License
    MIT License
  • Created over 2 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Tools for making SwiftUI navigation simpler, more ergonomic and more precise.

SwiftUI Navigation

CI Slack

Tools for making SwiftUI navigation simpler, more ergonomic and more precise.

Overview

SwiftUI comes with many forms of navigation (tabs, alerts, dialogs, modal sheets, popovers, navigation links, and more), and each comes with a few ways to construct them. These ways roughly fall in two categories:

  • "Fire-and-forget": These are initializers and methods that do not take binding arguments, which means SwiftUI fully manages navigation state internally. This makes it easy to get something on the screen quickly, but you also have no programmatic control over the navigation. Examples of this are the initializers on TabView and NavigationLink that do not take a binding.

  • "State-driven": Most other initializers and methods do take a binding, which means you can mutate state in your domain to tell SwiftUI when it should activate or deactivate navigation. Using these APIs is more complicated than the "fire-and-forget" style, but doing so instantly gives you the ability to deep-link into any state of your application by just constructing a piece of data, handing it to a SwiftUI view, and letting SwiftUI handle the rest.

Navigation that is "state-driven" is the more powerful form of navigation, albeit slightly more complicated. Unfortunately, SwiftUI does not ship with all of the tools necessary to model our domains with enums and make use of navigation APIs. This library bridges that gap by providing APIs that allow you to model your navigation destinations as an enum, and then drive navigation by a binding to that enum.

Explore all of the tools this library comes with by checking out the documentation, and reading these articles:

  • What is navigation?: Learn how one can think of navigation as a domain modeling problem, and how that leads to the creation of concise and testable APIs for navigation.

  • Navigation links and destinations: Learn how to drive navigation in NavigationView and NavigationStack in a concise and testable manner.

  • Sheets, popovers, and covers: Learn how to present sheets, popovers and covers in a concise and testable manner.

  • Alerts and dialogs: Learn how to present alerts and confirmation dialogs in a concise and testable manner.

  • Bindings: Learn how to manage certain view state, such as @FocusState directly in your observable object.

Examples

This repo comes with lots of examples to demonstrate how to solve common and complex navigation problems with the library. Check out this directory to see them all, including:

  • Case Studies
    • Alerts & Confirmation Dialogs
    • Sheets & Popovers & Fullscreen Covers
    • Navigation Links
    • Routing
    • Custom Components
  • Inventory: A multi-screen application with lists, sheets, popovers and alerts, all driven by state and deep-linkable.

Learn More

SwiftUI Navigation's tools were motivated and designed over the course of many episodes on Point-Free, a video series exploring functional programming and the Swift language, hosted by Brandon Williams and Stephen Celis.

You can watch all of the episodes here.

video poster image

Community

If you want to discuss this library or have a question about how to use it to solve a particular problem, there are a number of places you can discuss with fellow Point-Free enthusiasts:

Installation

You can add SwiftUI Navigation to an Xcode project by adding it as a package dependency.

https://github.com/pointfreeco/swiftui-navigation

If you want to use SwiftUI Navigation in a SwiftPM project, it's as simple as adding it to a dependencies clause in your Package.swift:

dependencies: [
  .package(url: "https://github.com/pointfreeco/swiftui-navigation", from: "0.7.1")
]

Documentation

The latest documentation for the SwiftUI Navigation APIs is available here.

License

This library is released under the MIT license. See LICENSE for details.

More Repositories

1

swift-composable-architecture

A library for building applications in a consistent and understandable way, with composition, testing, and ergonomics in mind.
Swift
10,990
star
2

swift-snapshot-testing

πŸ“Έ Delightful Swift snapshot testing.
Swift
3,559
star
3

isowords

Open source game built in SwiftUI and the Composable Architecture.
Swift
2,515
star
4

swift-dependencies

A dependency management library inspired by SwiftUI's "environment."
Swift
1,322
star
5

swift-tagged

🏷 A wrapper type for safer, expressive code.
Swift
1,289
star
6

swift-overture

🎼 A library for function composition.
Swift
1,115
star
7

pointfreeco

🎬 The source for www.pointfree.co, a video series on functional programming and the Swift programming language.
Swift
1,054
star
8

episode-code-samples

πŸ’Ύ Point-Free episode code.
Swift
922
star
9

swift-case-paths

🧰 Case paths extends the key path hierarchy to enum cases.
Swift
852
star
10

swift-nonempty

🎁 A compile-time guarantee that a collection contains a value.
Swift
817
star
11

swift-parsing

A library for turning nebulous data into well-structured data, with a focus on composition, performance, generality, and ergonomics.
Swift
802
star
12

swift-custom-dump

A collection of tools for debugging, diffing, and testing your application's data structures.
Swift
766
star
13

swift-html

πŸ—Ί A Swift DSL for type-safe, extensible, and transformable HTML documents.
Swift
726
star
14

combine-schedulers

⏰ A few schedulers that make working with Combine more testable and more versatile.
Swift
671
star
15

swift-web

πŸ•Έ A collection of Swift server-side frameworks for handling HTML, CSS, routing and middleware.
Swift
477
star
16

swift-identified-collections

A library of data structures for working with collections of identifiable elements in an ergonomic, performant way.
Swift
476
star
17

swift-prelude

🎢 A collection of types and functions that enhance the Swift language.
Swift
456
star
18

swift-perception

Observable tools, backported.
Swift
399
star
19

swift-validated

πŸ›‚ A result type that accumulates multiple errors.
Swift
389
star
20

swift-url-routing

A bidirectional router with more type safety and less fuss.
Swift
321
star
21

swift-concurrency-extras

Useful, testable Swift concurrency.
Swift
267
star
22

swift-gen

🎱 Composable, transformable, controllable randomness.
Swift
262
star
23

swift-clocks

⏰ A few clocks that make working with Swift concurrency more testable and more versatile.
Swift
229
star
24

swift-enum-properties

🀝 Struct and enum data access in harmony.
Swift
198
star
25

xctest-dynamic-overlay

Define XCTest assertion helpers directly in your application and library code.
Swift
197
star
26

swift-macro-testing

Magical testing tools for Swift macros.
Swift
192
star
27

syncups

A rebuild of Apple’s β€œScrumdinger” application using modern, best practices for SwiftUI development.
Swift
153
star
28

composable-core-location

A library that bridges the Composable Architecture and Core Location.
Swift
100
star
29

vapor-routing

A bidirectional Vapor router with more type safety and less fuss.
Swift
83
star
30

swift-html-vapor

πŸ’§ Vapor plugin for type-safe, transformable HTML views.
Swift
82
star
31

swift-playground-templates

🏫 A collection of helpful Xcode playground templates.
Makefile
80
star
32

pointfreeco-server

Point-Free server code.
39
star
33

swift-boundaries

🐣 Functional core, imperative shell.
Swift
27
star
34

composable-core-motion

A library that bridges the Composable Architecture and Core Motion.
Swift
26
star
35

swift-quickcheck

🏁 An implementation of QuickCheck in Swift.
Swift
24
star
36

swift-algebras

Algebraic laws bundled into concrete data types.
19
star
37

swift-either

For those times you want A or B!
Swift
19
star
38

swift-parser-printer

↔️ Parsing and printing
Swift
14
star
39

swift-html-kitura

☁️ Kitura plugin for type-safe, transformable HTML views.
Swift
13
star
40

homebrew-swift

Ruby
2
star
41

swift-bugs

2
star
42

Ccmark

Swift
1
star