├── NavigationDemoiOS16
├── Assets.xcassets
│ ├── Contents.json
│ ├── home.imageset
│ │ ├── home.jpg
│ │ └── Contents.json
│ ├── first.imageset
│ │ ├── first.jpg
│ │ └── Contents.json
│ ├── third.imageset
│ │ ├── third.jpg
│ │ └── Contents.json
│ ├── fourth.imageset
│ │ ├── fourth.jpg
│ │ └── Contents.json
│ ├── second.imageset
│ │ ├── second.jpg
│ │ └── Contents.json
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── backArrow.imageset
│ │ ├── Contents.json
│ │ └── backArrow.pdf
├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
├── NavigationDemoiOS16App.swift
├── Navigation
│ ├── NavigationPathItem.swift
│ └── NavigationStorage.swift
└── Presentation
│ ├── Views
│ ├── ThirdView.swift
│ ├── SecondView.swift
│ ├── ContentView.swift
│ └── FirstView.swift
│ ├── Extensions.swift
│ └── MainNavigationBar.swift
├── NavigationDemoiOS16.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── xcuserdata
│ └── ynikitina.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── project.pbxproj
└── README.md
/NavigationDemoiOS16/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/home.imageset/home.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joliejuly/swiftui_ios16_navigation_demo/HEAD/NavigationDemoiOS16/Assets.xcassets/home.imageset/home.jpg
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/first.imageset/first.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joliejuly/swiftui_ios16_navigation_demo/HEAD/NavigationDemoiOS16/Assets.xcassets/first.imageset/first.jpg
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/third.imageset/third.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joliejuly/swiftui_ios16_navigation_demo/HEAD/NavigationDemoiOS16/Assets.xcassets/third.imageset/third.jpg
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/fourth.imageset/fourth.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joliejuly/swiftui_ios16_navigation_demo/HEAD/NavigationDemoiOS16/Assets.xcassets/fourth.imageset/fourth.jpg
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/second.imageset/second.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joliejuly/swiftui_ios16_navigation_demo/HEAD/NavigationDemoiOS16/Assets.xcassets/second.imageset/second.jpg
--------------------------------------------------------------------------------
/NavigationDemoiOS16.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SwiftUI iOS16 navigation demo
2 | Demo project with web-like "breadcrumbs" navigation in iOS16
3 |
4 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/home.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "home.jpg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/first.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "first.jpg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/fourth.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "fourth.jpg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/second.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "second.jpg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/third.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "third.jpg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/backArrow.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "backArrow.pdf",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "template"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/NavigationDemoiOS16App.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NavigationDemoiOS16App.swift
3 | // NavigationDemoiOS16
4 | //
5 | // Created by Юлия Никитина on 14.09.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct NavigationDemoiOS16App: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16.xcodeproj/xcuserdata/ynikitina.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | NavigationDemoiOS16.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Navigation/NavigationPathItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NavigationPathItem.swift
3 | // NavigationDemo
4 | //
5 | // Created by Юлия Никитина on 14.09.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | /// Информация об экранах навигации
11 | final class NavigationPathItem: Identifiable, Hashable {
12 |
13 | /// Идентификатор
14 | let id: String
15 | /// Название экрана
16 | let title: String?
17 |
18 | var isShown: Bool
19 |
20 | var destination: () -> AnyView
21 |
22 | init(id: String, title: String, isShown: Bool = false, destination: @escaping () -> AnyView) {
23 | self.id = id
24 | self.title = title
25 | self.isShown = isShown
26 | self.destination = destination
27 | }
28 |
29 | static func == (lhs: NavigationPathItem, rhs: NavigationPathItem) -> Bool {
30 | lhs.id == rhs.id
31 | }
32 |
33 | func hash(into hasher: inout Hasher) {
34 | hasher.combine(id)
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Presentation/Views/ThirdView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftUIView.swift
3 | // NavigationDemoiOS16
4 | //
5 | // Created by joliejuly on 16.11.2022.
6 | //
7 |
8 |
9 | import SwiftUI
10 |
11 | struct ThirdView: View {
12 | var body: some View {
13 | ZStack {
14 | Color.black
15 | Image("third")
16 | .resizable()
17 | .aspectRatio(contentMode: .fit)
18 | VStack {
19 | MainNavigationBar()
20 | Spacer()
21 | Text("3")
22 | .font(.system(size: 60, weight: .heavy, design: .rounded))
23 | .foregroundColor(.white)
24 | Spacer()
25 | }
26 | .padding()
27 | }
28 | .navigationBarHidden(true)
29 | .ignoresSafeArea(.container, edges: .vertical)
30 | }
31 | }
32 |
33 |
34 | struct ThirdViewView_Previews: PreviewProvider {
35 | static var previews: some View {
36 | ThirdView()
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Navigation/NavigationStorage.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NavigationStorage.swift
3 | // NavigationDemo
4 | //
5 | // Created by Юлия Никитина on 14.09.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | /// Хранилище стека
11 | final class NavigationStorage: ObservableObject {
12 |
13 | static let shared = NavigationStorage()
14 |
15 | /// Хранение стека навигации
16 | @Published var path = [NavigationPathItem]()
17 |
18 |
19 | func show(id: String, title: String, destination: @escaping () -> some View) {
20 | let item = NavigationPathItem(id: id, title: title) {
21 | AnyView(destination())
22 | }
23 | item.isShown = true
24 | path.append(item)
25 | }
26 |
27 | func popToRoot() {
28 | UIApplication.enableKeyWindowAnimation()
29 | path.removeLast(path.count)
30 | }
31 |
32 | func popTo(index: Int) {
33 | guard !path.isEmpty, index < path.count else { return }
34 | UIApplication.enableKeyWindowAnimation()
35 | path.removeLast(path.count - index)
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Presentation/Views/SecondView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SecondView.swift
3 | // NavigationDemo
4 | //
5 | // Created by Юлия Никитина on 14.09.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct SecondView: View {
11 | var body: some View {
12 | ZStack {
13 | Color.black
14 | Image("second")
15 | .resizable()
16 | .aspectRatio(contentMode: .fit)
17 | VStack {
18 | MainNavigationBar()
19 | Spacer()
20 | Button {
21 | storage.show(id: ThirdView.navigationID, title: "Third") {
22 | ThirdView()
23 | }
24 | } label: {
25 | Text("2")
26 | .font(.system(size: 60, weight: .heavy, design: .rounded))
27 | .foregroundColor(.white)
28 | }
29 | Spacer()
30 | }
31 | .padding()
32 | }
33 | .navigationBarHidden(true)
34 | .ignoresSafeArea(.container, edges: .vertical)
35 | }
36 |
37 | private let storage = NavigationStorage.shared
38 | }
39 |
40 | struct SecondView_Previews: PreviewProvider {
41 | static var previews: some View {
42 | SecondView()
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Presentation/Views/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // NavigationDemo
4 | //
5 | // Created by Юлия Никитина on 13.09.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 | var body: some View {
12 | NavigationStack(path: $storage.path) {
13 | ZStack {
14 | Color.black
15 | Image("home")
16 | .resizable()
17 | .aspectRatio(contentMode: .fit)
18 | .opacity(0.7)
19 | Button {
20 | storage.show(id: FirstView.navigationID, title: "First") {
21 | FirstView()
22 | }
23 | } label: {
24 | Text("Go!")
25 | .font(.system(size: 50, weight: .heavy, design: .rounded))
26 | .foregroundColor(.white)
27 | }
28 | }
29 | .ignoresSafeArea()
30 | .navigationDestination(for: NavigationPathItem.self) { item in
31 | item.destination()
32 | }
33 | }
34 | }
35 |
36 | @StateObject private var storage = NavigationStorage.shared
37 | }
38 |
39 | struct ContentView_Previews: PreviewProvider {
40 | static var previews: some View {
41 | ContentView()
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Presentation/Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Extensions.swift
3 | // NavigationDemoiOS16
4 | //
5 | // Created by joliejuly on 16.11.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | extension View {
11 | static var navigationID: String {
12 | String(describing: self)
13 | }
14 | }
15 |
16 | extension UIApplication {
17 | var keyWindow: UIWindow? {
18 | // Get connected scenes
19 | return UIApplication.shared.connectedScenes
20 | // Keep only active scenes, onscreen and visible to the user
21 | .filter { $0.activationState == .foregroundActive }
22 | // Keep only the first `UIWindowScene`
23 | .first(where: { $0 is UIWindowScene })
24 | // Get its associated windows
25 | .flatMap({ $0 as? UIWindowScene })?.windows
26 | // Finally, keep only the key window
27 | .first(where: \.isKeyWindow)
28 | }
29 |
30 | static func enableKeyWindowAnimation() {
31 | let animation = CATransition()
32 | animation.isRemovedOnCompletion = true
33 | animation.type = .push
34 | animation.subtype = .fromLeft
35 | animation.duration = 0.3
36 | animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
37 | UIApplication.shared.keyWindow?.layer.add(animation, forKey: nil)
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Assets.xcassets/backArrow.imageset/backArrow.pdf:
--------------------------------------------------------------------------------
1 | %PDF-1.7
2 |
3 | 1 0 obj
4 | << >>
5 | endobj
6 |
7 | 2 0 obj
8 | << /Length 3 0 R >>
9 | stream
10 | /DeviceRGB CS
11 | /DeviceRGB cs
12 | q
13 | 1.000000 0.000000 -0.000000 1.000000 8.139648 6.036133 cm
14 | 0.228576 0.513894 0.945833 scn
15 | 8.786908 0.084069 m
16 | 8.996908 0.084069 9.195241 0.165734 9.346908 0.329068 c
17 | 9.626907 0.644068 9.603575 1.122401 9.300241 1.402401 c
18 | 1.869583 8.099417 l
19 | 9.346938 14.574421 l
20 | 9.661939 14.854422 9.673605 15.332755 9.393605 15.647755 c
21 | 9.113605 15.951088 8.635272 15.974422 8.320272 15.694422 c
22 | 0.271250 8.706081 l
23 | -0.090417 8.379416 -0.090417 7.819415 0.271250 7.492749 c
24 | 8.273575 0.282400 l
25 | 8.425241 0.142400 8.600242 0.084069 8.786908 0.084069 c
26 | h
27 | f
28 | n
29 | Q
30 |
31 | endstream
32 | endobj
33 |
34 | 3 0 obj
35 | 572
36 | endobj
37 |
38 | 4 0 obj
39 | << /Annots []
40 | /Type /Page
41 | /MediaBox [ 0.000000 0.000000 28.000000 28.000000 ]
42 | /Resources 1 0 R
43 | /Contents 2 0 R
44 | /Parent 5 0 R
45 | >>
46 | endobj
47 |
48 | 5 0 obj
49 | << /Kids [ 4 0 R ]
50 | /Count 1
51 | /Type /Pages
52 | >>
53 | endobj
54 |
55 | 6 0 obj
56 | << /Type /Catalog
57 | /Pages 5 0 R
58 | >>
59 | endobj
60 |
61 | xref
62 | 0 7
63 | 0000000000 65535 f
64 | 0000000010 00000 n
65 | 0000000034 00000 n
66 | 0000000662 00000 n
67 | 0000000684 00000 n
68 | 0000000857 00000 n
69 | 0000000931 00000 n
70 | trailer
71 | << /ID [ (some) (id) ]
72 | /Root 6 0 R
73 | /Size 7
74 | >>
75 | startxref
76 | 990
77 | %%EOF
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Presentation/Views/FirstView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FirstView.swift
3 | // NavigationDemo
4 | //
5 | // Created by Юлия Никитина on 14.09.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct FirstView: View {
11 |
12 | var body: some View {
13 | ZStack {
14 | Color.black
15 | Image("first")
16 | .resizable()
17 | .aspectRatio(contentMode: .fit)
18 | VStack {
19 | MainNavigationBar()
20 | Spacer()
21 | Button {
22 | storage.show(id: SecondView.navigationID, title: "Second") {
23 | SecondView()
24 | }
25 | } label: {
26 | Text("1")
27 | .font(.system(size: 60, weight: .heavy, design: .rounded))
28 | .foregroundColor(.white)
29 | }
30 | stepper
31 | Spacer()
32 | }
33 | .padding()
34 | }
35 | .ignoresSafeArea(.container, edges: .vertical)
36 | .navigationBarHidden(true)
37 | }
38 |
39 | private let storage = NavigationStorage.shared
40 |
41 | @State private var stepperValue: Float = 0
42 |
43 | private var stepper: some View {
44 | Stepper(value: $stepperValue, in: 1...30) {
45 | Text(String(stepperValue))
46 | .font(.title)
47 | }
48 | .padding()
49 | .background(
50 | Color.white
51 | .mask {
52 | RoundedRectangle(cornerRadius: 8)
53 | }
54 | )
55 | }
56 | }
57 |
58 | struct FirstView_Previews: PreviewProvider {
59 | static var previews: some View {
60 | FirstView()
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16/Presentation/MainNavigationBar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainNavigationBar.swift
3 | // NavigationDemo
4 | //
5 | // Created by Юлия Никитина on 14.09.2022.
6 | //
7 |
8 | import SwiftUI
9 |
10 | /// Бар навигации с хлебными крошками
11 | struct MainNavigationBar: View {
12 |
13 | private enum Constants {
14 | static let arrowImage = Image("backArrow")
15 | }
16 |
17 | var body: some View {
18 | VStack(alignment: .leading) {
19 | Spacer()
20 | .frame(height: 50)
21 | navigationTitlesView
22 | }
23 | }
24 |
25 | @ObservedObject private var storage = NavigationStorage.shared
26 |
27 | @ViewBuilder
28 | private var navigationTitlesView: some View {
29 | HStack {
30 | if !storage.path.isEmpty {
31 | makeTitleButton(item: "Home", index: -1, isLast: false)
32 | }
33 | ForEach(storage.path) { item in
34 | if let index = storage.path.firstIndex(of: item), item.isShown {
35 | let isLast = index == storage.path.endIndex - 1
36 | makeTitleButton(item: item.title ?? "", index: index, isLast: isLast)
37 | }
38 | }
39 | Spacer()
40 | }
41 | }
42 |
43 | @ViewBuilder
44 | private func makeTitleButton(item: String, index: Int, isLast: Bool) -> some View {
45 | let isHome = index == -1
46 | Button {
47 | guard !isLast else { return }
48 | if isHome {
49 | storage.popToRoot()
50 | } else {
51 | storage.popTo(index: index + 1)
52 | }
53 | } label: {
54 | if !isHome {
55 | Constants.arrowImage
56 | }
57 | Text(item)
58 | .font(.system(size: 20, weight: isLast ? .heavy : .medium, design: .rounded))
59 | .lineLimit(1)
60 | }
61 | .frame(height: 30)
62 | .foregroundColor(.white)
63 | }
64 | }
65 |
66 |
67 |
68 | struct MainNavigationBar_Previews: PreviewProvider {
69 | static var previews: some View {
70 | MainNavigationBar()
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/NavigationDemoiOS16.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 5022A15D28D215E20048AA41 /* NavigationDemoiOS16App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5022A15C28D215E20048AA41 /* NavigationDemoiOS16App.swift */; };
11 | 5022A16428D215E30048AA41 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5022A16328D215E30048AA41 /* Preview Assets.xcassets */; };
12 | 5022A17828D21CE20048AA41 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5022A16E28D215F80048AA41 /* ContentView.swift */; };
13 | 5022A17928D21CE50048AA41 /* FirstView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5022A16D28D215F80048AA41 /* FirstView.swift */; };
14 | 5022A17A28D21CE80048AA41 /* SecondView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5022A16C28D215F80048AA41 /* SecondView.swift */; };
15 | 5022A17C28D21CEF0048AA41 /* NavigationStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5022A17128D215F80048AA41 /* NavigationStorage.swift */; };
16 | 5022A17D28D21CEF0048AA41 /* MainNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5022A17328D215F80048AA41 /* MainNavigationBar.swift */; };
17 | 5022A18328D33CEE0048AA41 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5022A18228D33CEE0048AA41 /* Assets.xcassets */; };
18 | 5075C78E28D88881000B473D /* NavigationPathItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5075C78D28D88881000B473D /* NavigationPathItem.swift */; };
19 | F769BBDB2924D9980076FF4B /* ThirdView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F769BBDA2924D9980076FF4B /* ThirdView.swift */; };
20 | F769BBDD2924E1AC0076FF4B /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F769BBDC2924E1AC0076FF4B /* Extensions.swift */; };
21 | /* End PBXBuildFile section */
22 |
23 | /* Begin PBXFileReference section */
24 | 5022A15928D215E20048AA41 /* NavigationDemoiOS16.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NavigationDemoiOS16.app; sourceTree = BUILT_PRODUCTS_DIR; };
25 | 5022A15C28D215E20048AA41 /* NavigationDemoiOS16App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationDemoiOS16App.swift; sourceTree = ""; };
26 | 5022A16328D215E30048AA41 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
27 | 5022A16C28D215F80048AA41 /* SecondView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondView.swift; sourceTree = ""; };
28 | 5022A16D28D215F80048AA41 /* FirstView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstView.swift; sourceTree = ""; };
29 | 5022A16E28D215F80048AA41 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
30 | 5022A17128D215F80048AA41 /* NavigationStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationStorage.swift; sourceTree = ""; };
31 | 5022A17328D215F80048AA41 /* MainNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainNavigationBar.swift; sourceTree = ""; };
32 | 5022A18228D33CEE0048AA41 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
33 | 5075C78D28D88881000B473D /* NavigationPathItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationPathItem.swift; sourceTree = ""; };
34 | F769BBDA2924D9980076FF4B /* ThirdView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdView.swift; sourceTree = ""; };
35 | F769BBDC2924E1AC0076FF4B /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; };
36 | /* End PBXFileReference section */
37 |
38 | /* Begin PBXFrameworksBuildPhase section */
39 | 5022A15628D215E20048AA41 /* Frameworks */ = {
40 | isa = PBXFrameworksBuildPhase;
41 | buildActionMask = 2147483647;
42 | files = (
43 | );
44 | runOnlyForDeploymentPostprocessing = 0;
45 | };
46 | /* End PBXFrameworksBuildPhase section */
47 |
48 | /* Begin PBXGroup section */
49 | 5022A15028D215E20048AA41 = {
50 | isa = PBXGroup;
51 | children = (
52 | 5022A15B28D215E20048AA41 /* NavigationDemoiOS16 */,
53 | 5022A15A28D215E20048AA41 /* Products */,
54 | );
55 | sourceTree = "";
56 | };
57 | 5022A15A28D215E20048AA41 /* Products */ = {
58 | isa = PBXGroup;
59 | children = (
60 | 5022A15928D215E20048AA41 /* NavigationDemoiOS16.app */,
61 | );
62 | name = Products;
63 | sourceTree = "";
64 | };
65 | 5022A15B28D215E20048AA41 /* NavigationDemoiOS16 */ = {
66 | isa = PBXGroup;
67 | children = (
68 | 5022A18228D33CEE0048AA41 /* Assets.xcassets */,
69 | 5022A15C28D215E20048AA41 /* NavigationDemoiOS16App.swift */,
70 | 5022A16F28D215F80048AA41 /* Navigation */,
71 | 5022A16B28D215F80048AA41 /* Presentation */,
72 | 5022A16228D215E30048AA41 /* Preview Content */,
73 | );
74 | path = NavigationDemoiOS16;
75 | sourceTree = "";
76 | };
77 | 5022A16228D215E30048AA41 /* Preview Content */ = {
78 | isa = PBXGroup;
79 | children = (
80 | 5022A16328D215E30048AA41 /* Preview Assets.xcassets */,
81 | );
82 | path = "Preview Content";
83 | sourceTree = "";
84 | };
85 | 5022A16B28D215F80048AA41 /* Presentation */ = {
86 | isa = PBXGroup;
87 | children = (
88 | 5022A17328D215F80048AA41 /* MainNavigationBar.swift */,
89 | F769BBDC2924E1AC0076FF4B /* Extensions.swift */,
90 | F769BBDE2924E2F80076FF4B /* Views */,
91 | );
92 | path = Presentation;
93 | sourceTree = "";
94 | };
95 | 5022A16F28D215F80048AA41 /* Navigation */ = {
96 | isa = PBXGroup;
97 | children = (
98 | 5022A17128D215F80048AA41 /* NavigationStorage.swift */,
99 | 5075C78D28D88881000B473D /* NavigationPathItem.swift */,
100 | );
101 | path = Navigation;
102 | sourceTree = "";
103 | };
104 | F769BBDE2924E2F80076FF4B /* Views */ = {
105 | isa = PBXGroup;
106 | children = (
107 | 5022A16C28D215F80048AA41 /* SecondView.swift */,
108 | F769BBDA2924D9980076FF4B /* ThirdView.swift */,
109 | 5022A16D28D215F80048AA41 /* FirstView.swift */,
110 | 5022A16E28D215F80048AA41 /* ContentView.swift */,
111 | );
112 | path = Views;
113 | sourceTree = "";
114 | };
115 | /* End PBXGroup section */
116 |
117 | /* Begin PBXNativeTarget section */
118 | 5022A15828D215E20048AA41 /* NavigationDemoiOS16 */ = {
119 | isa = PBXNativeTarget;
120 | buildConfigurationList = 5022A16728D215E30048AA41 /* Build configuration list for PBXNativeTarget "NavigationDemoiOS16" */;
121 | buildPhases = (
122 | 5022A15528D215E20048AA41 /* Sources */,
123 | 5022A15628D215E20048AA41 /* Frameworks */,
124 | 5022A15728D215E20048AA41 /* Resources */,
125 | );
126 | buildRules = (
127 | );
128 | dependencies = (
129 | );
130 | name = NavigationDemoiOS16;
131 | productName = NavigationDemoiOS16;
132 | productReference = 5022A15928D215E20048AA41 /* NavigationDemoiOS16.app */;
133 | productType = "com.apple.product-type.application";
134 | };
135 | /* End PBXNativeTarget section */
136 |
137 | /* Begin PBXProject section */
138 | 5022A15128D215E20048AA41 /* Project object */ = {
139 | isa = PBXProject;
140 | attributes = {
141 | BuildIndependentTargetsInParallel = 1;
142 | LastSwiftUpdateCheck = 1400;
143 | LastUpgradeCheck = 1400;
144 | TargetAttributes = {
145 | 5022A15828D215E20048AA41 = {
146 | CreatedOnToolsVersion = 14.0;
147 | };
148 | };
149 | };
150 | buildConfigurationList = 5022A15428D215E20048AA41 /* Build configuration list for PBXProject "NavigationDemoiOS16" */;
151 | compatibilityVersion = "Xcode 14.0";
152 | developmentRegion = en;
153 | hasScannedForEncodings = 0;
154 | knownRegions = (
155 | en,
156 | Base,
157 | );
158 | mainGroup = 5022A15028D215E20048AA41;
159 | productRefGroup = 5022A15A28D215E20048AA41 /* Products */;
160 | projectDirPath = "";
161 | projectRoot = "";
162 | targets = (
163 | 5022A15828D215E20048AA41 /* NavigationDemoiOS16 */,
164 | );
165 | };
166 | /* End PBXProject section */
167 |
168 | /* Begin PBXResourcesBuildPhase section */
169 | 5022A15728D215E20048AA41 /* Resources */ = {
170 | isa = PBXResourcesBuildPhase;
171 | buildActionMask = 2147483647;
172 | files = (
173 | 5022A16428D215E30048AA41 /* Preview Assets.xcassets in Resources */,
174 | 5022A18328D33CEE0048AA41 /* Assets.xcassets in Resources */,
175 | );
176 | runOnlyForDeploymentPostprocessing = 0;
177 | };
178 | /* End PBXResourcesBuildPhase section */
179 |
180 | /* Begin PBXSourcesBuildPhase section */
181 | 5022A15528D215E20048AA41 /* Sources */ = {
182 | isa = PBXSourcesBuildPhase;
183 | buildActionMask = 2147483647;
184 | files = (
185 | 5075C78E28D88881000B473D /* NavigationPathItem.swift in Sources */,
186 | F769BBDD2924E1AC0076FF4B /* Extensions.swift in Sources */,
187 | 5022A17D28D21CEF0048AA41 /* MainNavigationBar.swift in Sources */,
188 | F769BBDB2924D9980076FF4B /* ThirdView.swift in Sources */,
189 | 5022A17828D21CE20048AA41 /* ContentView.swift in Sources */,
190 | 5022A17C28D21CEF0048AA41 /* NavigationStorage.swift in Sources */,
191 | 5022A17928D21CE50048AA41 /* FirstView.swift in Sources */,
192 | 5022A17A28D21CE80048AA41 /* SecondView.swift in Sources */,
193 | 5022A15D28D215E20048AA41 /* NavigationDemoiOS16App.swift in Sources */,
194 | );
195 | runOnlyForDeploymentPostprocessing = 0;
196 | };
197 | /* End PBXSourcesBuildPhase section */
198 |
199 | /* Begin XCBuildConfiguration section */
200 | 5022A16528D215E30048AA41 /* Debug */ = {
201 | isa = XCBuildConfiguration;
202 | buildSettings = {
203 | ALWAYS_SEARCH_USER_PATHS = NO;
204 | CLANG_ANALYZER_NONNULL = YES;
205 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
206 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
207 | CLANG_ENABLE_MODULES = YES;
208 | CLANG_ENABLE_OBJC_ARC = YES;
209 | CLANG_ENABLE_OBJC_WEAK = YES;
210 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
211 | CLANG_WARN_BOOL_CONVERSION = YES;
212 | CLANG_WARN_COMMA = YES;
213 | CLANG_WARN_CONSTANT_CONVERSION = YES;
214 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
215 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
216 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
217 | CLANG_WARN_EMPTY_BODY = YES;
218 | CLANG_WARN_ENUM_CONVERSION = YES;
219 | CLANG_WARN_INFINITE_RECURSION = YES;
220 | CLANG_WARN_INT_CONVERSION = YES;
221 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
222 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
223 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
224 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
225 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
226 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
227 | CLANG_WARN_STRICT_PROTOTYPES = YES;
228 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
229 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
230 | CLANG_WARN_UNREACHABLE_CODE = YES;
231 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
232 | COPY_PHASE_STRIP = NO;
233 | DEBUG_INFORMATION_FORMAT = dwarf;
234 | ENABLE_STRICT_OBJC_MSGSEND = YES;
235 | ENABLE_TESTABILITY = YES;
236 | GCC_C_LANGUAGE_STANDARD = gnu11;
237 | GCC_DYNAMIC_NO_PIC = NO;
238 | GCC_NO_COMMON_BLOCKS = YES;
239 | GCC_OPTIMIZATION_LEVEL = 0;
240 | GCC_PREPROCESSOR_DEFINITIONS = (
241 | "DEBUG=1",
242 | "$(inherited)",
243 | );
244 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
245 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
246 | GCC_WARN_UNDECLARED_SELECTOR = YES;
247 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
248 | GCC_WARN_UNUSED_FUNCTION = YES;
249 | GCC_WARN_UNUSED_VARIABLE = YES;
250 | IPHONEOS_DEPLOYMENT_TARGET = 16.0;
251 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
252 | MTL_FAST_MATH = YES;
253 | ONLY_ACTIVE_ARCH = YES;
254 | SDKROOT = iphoneos;
255 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
256 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
257 | };
258 | name = Debug;
259 | };
260 | 5022A16628D215E30048AA41 /* Release */ = {
261 | isa = XCBuildConfiguration;
262 | buildSettings = {
263 | ALWAYS_SEARCH_USER_PATHS = NO;
264 | CLANG_ANALYZER_NONNULL = YES;
265 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
266 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
267 | CLANG_ENABLE_MODULES = YES;
268 | CLANG_ENABLE_OBJC_ARC = YES;
269 | CLANG_ENABLE_OBJC_WEAK = YES;
270 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
271 | CLANG_WARN_BOOL_CONVERSION = YES;
272 | CLANG_WARN_COMMA = YES;
273 | CLANG_WARN_CONSTANT_CONVERSION = YES;
274 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
275 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
276 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
277 | CLANG_WARN_EMPTY_BODY = YES;
278 | CLANG_WARN_ENUM_CONVERSION = YES;
279 | CLANG_WARN_INFINITE_RECURSION = YES;
280 | CLANG_WARN_INT_CONVERSION = YES;
281 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
282 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
283 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
284 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
285 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
286 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
287 | CLANG_WARN_STRICT_PROTOTYPES = YES;
288 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
289 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
290 | CLANG_WARN_UNREACHABLE_CODE = YES;
291 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
292 | COPY_PHASE_STRIP = NO;
293 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
294 | ENABLE_NS_ASSERTIONS = NO;
295 | ENABLE_STRICT_OBJC_MSGSEND = YES;
296 | GCC_C_LANGUAGE_STANDARD = gnu11;
297 | GCC_NO_COMMON_BLOCKS = YES;
298 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
299 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
300 | GCC_WARN_UNDECLARED_SELECTOR = YES;
301 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
302 | GCC_WARN_UNUSED_FUNCTION = YES;
303 | GCC_WARN_UNUSED_VARIABLE = YES;
304 | IPHONEOS_DEPLOYMENT_TARGET = 16.0;
305 | MTL_ENABLE_DEBUG_INFO = NO;
306 | MTL_FAST_MATH = YES;
307 | SDKROOT = iphoneos;
308 | SWIFT_COMPILATION_MODE = wholemodule;
309 | SWIFT_OPTIMIZATION_LEVEL = "-O";
310 | VALIDATE_PRODUCT = YES;
311 | };
312 | name = Release;
313 | };
314 | 5022A16828D215E30048AA41 /* Debug */ = {
315 | isa = XCBuildConfiguration;
316 | buildSettings = {
317 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
318 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
319 | CODE_SIGN_STYLE = Automatic;
320 | CURRENT_PROJECT_VERSION = 1;
321 | DEVELOPMENT_ASSET_PATHS = "\"NavigationDemoiOS16/Preview Content\"";
322 | ENABLE_PREVIEWS = YES;
323 | GENERATE_INFOPLIST_FILE = YES;
324 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
325 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
326 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
327 | INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
328 | LD_RUNPATH_SEARCH_PATHS = (
329 | "$(inherited)",
330 | "@executable_path/Frameworks",
331 | );
332 | MARKETING_VERSION = 1.0;
333 | PRODUCT_BUNDLE_IDENTIFIER = joliejuly.NavigationDemoiOS16;
334 | PRODUCT_NAME = "$(TARGET_NAME)";
335 | SWIFT_EMIT_LOC_STRINGS = YES;
336 | SWIFT_VERSION = 5.0;
337 | TARGETED_DEVICE_FAMILY = "1,2";
338 | };
339 | name = Debug;
340 | };
341 | 5022A16928D215E30048AA41 /* Release */ = {
342 | isa = XCBuildConfiguration;
343 | buildSettings = {
344 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
345 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
346 | CODE_SIGN_STYLE = Automatic;
347 | CURRENT_PROJECT_VERSION = 1;
348 | DEVELOPMENT_ASSET_PATHS = "\"NavigationDemoiOS16/Preview Content\"";
349 | ENABLE_PREVIEWS = YES;
350 | GENERATE_INFOPLIST_FILE = YES;
351 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
352 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
353 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
354 | INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
355 | LD_RUNPATH_SEARCH_PATHS = (
356 | "$(inherited)",
357 | "@executable_path/Frameworks",
358 | );
359 | MARKETING_VERSION = 1.0;
360 | PRODUCT_BUNDLE_IDENTIFIER = joliejuly.NavigationDemoiOS16;
361 | PRODUCT_NAME = "$(TARGET_NAME)";
362 | SWIFT_EMIT_LOC_STRINGS = YES;
363 | SWIFT_VERSION = 5.0;
364 | TARGETED_DEVICE_FAMILY = "1,2";
365 | };
366 | name = Release;
367 | };
368 | /* End XCBuildConfiguration section */
369 |
370 | /* Begin XCConfigurationList section */
371 | 5022A15428D215E20048AA41 /* Build configuration list for PBXProject "NavigationDemoiOS16" */ = {
372 | isa = XCConfigurationList;
373 | buildConfigurations = (
374 | 5022A16528D215E30048AA41 /* Debug */,
375 | 5022A16628D215E30048AA41 /* Release */,
376 | );
377 | defaultConfigurationIsVisible = 0;
378 | defaultConfigurationName = Release;
379 | };
380 | 5022A16728D215E30048AA41 /* Build configuration list for PBXNativeTarget "NavigationDemoiOS16" */ = {
381 | isa = XCConfigurationList;
382 | buildConfigurations = (
383 | 5022A16828D215E30048AA41 /* Debug */,
384 | 5022A16928D215E30048AA41 /* Release */,
385 | );
386 | defaultConfigurationIsVisible = 0;
387 | defaultConfigurationName = Release;
388 | };
389 | /* End XCConfigurationList section */
390 | };
391 | rootObject = 5022A15128D215E20048AA41 /* Project object */;
392 | }
393 |
--------------------------------------------------------------------------------