├── 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 | image 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 | --------------------------------------------------------------------------------