├── .gitignore
├── LICENSE
├── README.md
├── Tutorials
├── CameraAndGalleryTutorial
│ ├── CameraAndGalleryTutorial.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata
│ │ │ │ └── duybui.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── CameraAndGalleryTutorial
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ ├── ContentView.swift
│ │ ├── Coordinator.swift
│ │ ├── Info.plist
│ │ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
├── ChatViewTutorial
│ ├── ChatViewTutorial.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata
│ │ │ │ └── duybui.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── ChatViewTutorial
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── lady.imageset
│ │ │ ├── Contents.json
│ │ │ └── lady.jpg
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ ├── Helper
│ │ ├── ChatHelper.swift
│ │ ├── KeyboardResponder.swift
│ │ └── ViewExtension.swift
│ │ ├── Info.plist
│ │ ├── Models
│ │ ├── Message.swift
│ │ └── User.swift
│ │ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ │ ├── SceneDelegate.swift
│ │ └── View
│ │ ├── ChatView.swift
│ │ ├── ContentMessageView.swift
│ │ └── MessageView.swift
├── FirebaseCloudStorageInSwiftUI
│ ├── FirebaseCloudStorageInSwiftUI.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata
│ │ │ │ └── duybui.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ ├── FirebaseCloudStorageInSwiftUI.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ ├── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ ├── UserInterfaceState.xcuserstate
│ │ │ └── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ ├── FirebaseCloudStorageInSwiftUI
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ │ ├── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ ├── ContentView.swift
│ │ ├── GoogleService-Info.plist
│ │ ├── Info.plist
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
│ └── Podfile
├── LoginScreenTutorial
│ ├── LoginScreenTutorial.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata
│ │ │ │ └── duybui.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── LoginScreenTutorial
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── iosapptemplate.imageset
│ │ │ ├── Contents.json
│ │ │ └── iosapptemplate.png
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ ├── ContentView.swift
│ │ ├── Info.plist
│ │ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
├── MapViewTutorial
│ ├── MapViewTutorial.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata
│ │ │ │ └── duybui.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ ├── xcshareddata
│ │ │ └── xcschemes
│ │ │ │ └── MapViewTutorial.xcscheme
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── MapViewTutorial
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ ├── ContentView.swift
│ │ ├── Info.plist
│ │ ├── MapViewAdvance.swift
│ │ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
├── NavigationDrawerTutorial
│ ├── NavigationDrawerTutorial.xcodeproj
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── NavigationDrawerTutorial
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ ├── ContentView.swift
│ │ ├── Info.plist
│ │ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
├── SwiftUICombineMVVM
│ ├── SwiftUICombineMVVM.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata
│ │ │ │ └── duybui.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── SwiftUICombineMVVM
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── beer.imageset
│ │ │ ├── Contents.json
│ │ │ └── beer.jpg
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ ├── BreweriesView.swift
│ │ ├── BreweriesViewModel.swift
│ │ ├── Brewery.swift
│ │ ├── BreweryView.swift
│ │ ├── Info.plist
│ │ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
├── TabbedViewTutorial
│ ├── TabbedViewTutorial.xcodeproj
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── TabbedViewTutorial
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ ├── ContentView.swift
│ │ ├── Info.plist
│ │ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ │ └── SceneDelegate.swift
└── TheHorizontalProgressBarTutorial
│ ├── TheHorizontalProgressBarView.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ ├── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcuserdata
│ │ │ └── duybui.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcuserdata
│ │ └── duybui.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ └── TheHorizontalProgressBarView
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── Contents.json
│ ├── Base.lproj
│ └── LaunchScreen.storyboard
│ ├── ContentView.swift
│ ├── Info.plist
│ ├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
│ └── SceneDelegate.swift
└── devassistDocs
└── Tutorials
├── CameraAndGalleryTutorial
├── CameraAndGalleryTutorial.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── CameraAndGalleryTutorial
│ ├── AppDelegate.swift.md
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── ContentView.swift.md
│ ├── Coordinator.swift.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ ├── SceneDelegate.swift.md
│ └── _sidebar.md
├── README.md
└── _sidebar.md
├── ChatViewTutorial
├── ChatViewTutorial.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── ChatViewTutorial
│ ├── AppDelegate.swift.md
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── lady.imageset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Helper
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Models
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ ├── View
│ │ ├── README.md
│ │ └── _sidebar.md
│ └── _sidebar.md
├── README.md
└── _sidebar.md
├── FirebaseCloudStorageInSwiftUI
├── FirebaseCloudStorageInSwiftUI.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── FirebaseCloudStorageInSwiftUI.xcworkspace
│ ├── README.md
│ ├── _sidebar.md
│ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── FirebaseCloudStorageInSwiftUI
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ └── _sidebar.md
├── README.md
└── _sidebar.md
├── LoginScreenTutorial
├── LoginScreenTutorial.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── LoginScreenTutorial
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── iosapptemplate.imageset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ └── _sidebar.md
├── README.md
└── _sidebar.md
├── MapViewTutorial
├── MapViewTutorial.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ ├── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ └── xcshareddata
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcschemes
│ │ ├── README.md
│ │ └── _sidebar.md
├── MapViewTutorial
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ └── _sidebar.md
├── README.md
└── _sidebar.md
├── NavigationDrawerTutorial
├── NavigationDrawerTutorial.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── NavigationDrawerTutorial
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ └── _sidebar.md
├── README.md
└── _sidebar.md
├── README.md
├── SwiftUICombineMVVM
├── README.md
├── SwiftUICombineMVVM.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── SwiftUICombineMVVM
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── beer.imageset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ └── _sidebar.md
└── _sidebar.md
├── TabbedViewTutorial
├── README.md
├── TabbedViewTutorial.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── TabbedViewTutorial
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ └── _sidebar.md
└── _sidebar.md
├── TheHorizontalProgressBarTutorial
├── README.md
├── TheHorizontalProgressBarView.xcodeproj
│ ├── README.md
│ ├── _sidebar.md
│ └── project.xcworkspace
│ │ ├── README.md
│ │ ├── _sidebar.md
│ │ └── xcshareddata
│ │ ├── README.md
│ │ └── _sidebar.md
├── TheHorizontalProgressBarView
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Base.lproj
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── Preview Content
│ │ ├── Preview Assets.xcassets
│ │ │ ├── README.md
│ │ │ └── _sidebar.md
│ │ ├── README.md
│ │ └── _sidebar.md
│ ├── README.md
│ └── _sidebar.md
└── _sidebar.md
└── _sidebar.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData/
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata/
19 |
20 | ## Other
21 | *.moved-aside
22 | *.xccheckout
23 | *.xcscmblueprint
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 | *.ipa
28 | *.dSYM.zip
29 | *.dSYM
30 |
31 | ## Playgrounds
32 | timeline.xctimeline
33 | playground.xcworkspace
34 |
35 | # Swift Package Manager
36 | #
37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
38 | # Packages/
39 | # Package.pins
40 | # Package.resolved
41 | .build/
42 |
43 | # CocoaPods
44 | #
45 | # We recommend against adding the Pods directory to your .gitignore. However
46 | # you should judge for yourself, the pros and cons are mentioned at:
47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
48 | #
49 | # Pods/
50 |
51 | # Carthage
52 | #
53 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
54 | # Carthage/Checkouts
55 |
56 | Carthage/Build
57 |
58 | # fastlane
59 | #
60 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
61 | # screenshots whenever they are needed.
62 | # For more information about the recommended setup visit:
63 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
64 |
65 | fastlane/report.xml
66 | fastlane/Preview.html
67 | fastlane/screenshots/**/*.png
68 | fastlane/test_output
69 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 mrcflorian
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SwiftUI Tutorials
2 |
3 | The goal of this repository is to save/ store all source code related to our SwiftUI tutorials. They can be found here https://iosapptemplates.com/blog
4 |
5 | Beside that we also provide premium functional iOS app templates, UI Kits and freebies, written in Swift to help developers and entrepreneurs make their own iOS apps in just a few hours.
6 |
7 | If you want to know more, just come have a look at our website. https://iosapptemplates.com
8 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/xcuserdata/duybui.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/xcuserdata/duybui.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | CameraAndGalleryTutorial.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // CameraAndGalleryTutorial
4 | //
5 | // Created by Duy Bui on 10/26/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // CameraAndGalleryTutorial
4 | //
5 | // Created by Duy Bui on 10/26/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct CaptureImageView {
12 |
13 | /// MARK: - Properties
14 | @Binding var isShown: Bool
15 | @Binding var image: Image?
16 |
17 | func makeCoordinator() -> Coordinator {
18 | return Coordinator(isShown: $isShown, image: $image)
19 | }
20 | }
21 |
22 | extension CaptureImageView: UIViewControllerRepresentable {
23 | func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIImagePickerController {
24 | let picker = UIImagePickerController()
25 | picker.delegate = context.coordinator
26 | /// Default is images gallery. Un-comment the next line of code if you would like to test camera
27 | // picker.sourceType = .camera
28 | return picker
29 | }
30 |
31 | func updateUIViewController(_ uiViewController: UIImagePickerController,
32 | context: UIViewControllerRepresentableContext) {
33 |
34 | }
35 | }
36 |
37 | struct ContentView: View {
38 |
39 | @State var image: Image? = nil
40 | @State var showCaptureImageView: Bool = false
41 |
42 | var body: some View {
43 | ZStack {
44 | VStack {
45 | Button(action: {
46 | self.showCaptureImageView.toggle()
47 | }) {
48 | Text("Choose photos")
49 | }
50 | image?.resizable()
51 | .frame(width: 250, height: 200)
52 | .clipShape(Circle())
53 | .overlay(Circle().stroke(Color.white, lineWidth: 4))
54 | .shadow(radius: 10)
55 | }
56 | if (showCaptureImageView) {
57 | CaptureImageView(isShown: $showCaptureImageView, image: $image)
58 | }
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Coordinator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Coordinator.swift
3 | // CameraAndGalleryTutorial
4 | //
5 | // Created by Duy Bui on 10/26/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
12 |
13 | @Binding var isCoordinatorShown: Bool
14 | @Binding var imageInCoordinator: Image?
15 |
16 | init(isShown: Binding, image: Binding) {
17 | _isCoordinatorShown = isShown
18 | _imageInCoordinator = image
19 | }
20 |
21 | func imagePickerController(_ picker: UIImagePickerController,
22 | didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
23 | guard let unwrapImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else { return }
24 | imageInCoordinator = Image(uiImage: unwrapImage)
25 | isCoordinatorShown = false
26 | }
27 |
28 | func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
29 | isCoordinatorShown = false
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSCameraUsageDescription
6 | Tell users why they need to access your camera
7 | CFBundleDevelopmentRegion
8 | $(DEVELOPMENT_LANGUAGE)
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UIApplicationSceneManifest
26 |
27 | UIApplicationSupportsMultipleScenes
28 |
29 | UISceneConfigurations
30 |
31 | UIWindowSceneSessionRoleApplication
32 |
33 |
34 | UISceneConfigurationName
35 | Default Configuration
36 | UISceneDelegateClassName
37 | $(PRODUCT_MODULE_NAME).SceneDelegate
38 |
39 |
40 |
41 |
42 | UILaunchStoryboardName
43 | LaunchScreen
44 | UIRequiredDeviceCapabilities
45 |
46 | armv7
47 |
48 | UISupportedInterfaceOrientations
49 |
50 | UIInterfaceOrientationPortrait
51 | UIInterfaceOrientationLandscapeLeft
52 | UIInterfaceOrientationLandscapeRight
53 |
54 | UISupportedInterfaceOrientations~ipad
55 |
56 | UIInterfaceOrientationPortrait
57 | UIInterfaceOrientationPortraitUpsideDown
58 | UIInterfaceOrientationLandscapeLeft
59 | UIInterfaceOrientationLandscapeRight
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // CameraAndGalleryTutorial
4 | //
5 | // Created by Duy Bui on 10/26/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 |
22 | // Create the SwiftUI view that provides the window contents.
23 | let contentView = ContentView()
24 |
25 | // Use a UIHostingController as window root view controller.
26 | if let windowScene = scene as? UIWindowScene {
27 | let window = UIWindow(windowScene: windowScene)
28 | window.rootViewController = UIHostingController(rootView: contentView)
29 | self.window = window
30 | window.makeKeyAndVisible()
31 | }
32 | }
33 |
34 | func sceneDidDisconnect(_ scene: UIScene) {
35 | // Called as the scene is being released by the system.
36 | // This occurs shortly after the scene enters the background, or when its session is discarded.
37 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
39 | }
40 |
41 | func sceneDidBecomeActive(_ scene: UIScene) {
42 | // Called when the scene has moved from an inactive state to an active state.
43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
44 | }
45 |
46 | func sceneWillResignActive(_ scene: UIScene) {
47 | // Called when the scene will move from an active state to an inactive state.
48 | // This may occur due to temporary interruptions (ex. an incoming phone call).
49 | }
50 |
51 | func sceneWillEnterForeground(_ scene: UIScene) {
52 | // Called as the scene transitions from the background to the foreground.
53 | // Use this method to undo the changes made on entering the background.
54 | }
55 |
56 | func sceneDidEnterBackground(_ scene: UIScene) {
57 | // Called as the scene transitions from the foreground to the background.
58 | // Use this method to save data, release shared resources, and store enough scene-specific state information
59 | // to restore the scene back to its current state.
60 | }
61 |
62 |
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/xcuserdata/duybui.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | ChatViewTutorial.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/lady.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "lady.jpg",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/lady.imageset/lady.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/lady.imageset/lady.jpg
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Helper/ChatHelper.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChatHelper.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import Combine
10 |
11 | class ChatHelper : ObservableObject {
12 | var didChange = PassthroughSubject()
13 | @Published var realTimeMessages = DataSource.messages
14 |
15 | func sendMessage(_ chatMessage: Message) {
16 | realTimeMessages.append(chatMessage)
17 | didChange.send(())
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Helper/KeyboardResponder.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KeyboardResponder.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 | import Foundation
9 | import SwiftUI
10 | import Combine
11 |
12 | final class KeyboardResponder: ObservableObject {
13 | private var notificationCenter: NotificationCenter
14 | @Published private(set) var currentHeight: CGFloat = 0
15 |
16 | init(center: NotificationCenter = .default) {
17 | notificationCenter = center
18 | notificationCenter.addObserver(self, selector: #selector(keyBoardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
19 | notificationCenter.addObserver(self, selector: #selector(keyBoardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
20 | }
21 |
22 | deinit {
23 | notificationCenter.removeObserver(self)
24 | }
25 |
26 | @objc func keyBoardWillShow(notification: Notification) {
27 | if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
28 | currentHeight = keyboardSize.height
29 | }
30 | }
31 |
32 | @objc func keyBoardWillHide(notification: Notification) {
33 | currentHeight = 0
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Helper/ViewExtension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewExtension.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | extension View {
12 | func endEditing(_ force: Bool) {
13 | UIApplication.shared.windows.forEach { $0.endEditing(force)}
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Models/Message.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Message.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct Message: Hashable {
12 | var content: String
13 | var user: User
14 | }
15 |
16 | struct DataSource {
17 | static let firstUser = User(name: "Maria Shadapova", avatar: "lady")
18 | static var secondUser = User(name: "Duy Bui", avatar: "myAvatar", isCurrentUser: true)
19 | static let messages = [
20 | Message(content: "Hi, I really love your templates and I would like to buy the chat template", user: DataSource.firstUser),
21 | Message(content: "Thanks, nice to hear that, can I have your email please?", user: DataSource.secondUser),
22 | Message(content: "😇", user: DataSource.firstUser),
23 | Message(content: "Oh actually, I have just purchased the chat template, so please check your email, you might see my order", user: DataSource.firstUser),
24 | Message(content: "Great, wait me a sec, let me check", user: DataSource.secondUser),
25 | Message(content: "Sure", user: DataSource.firstUser)
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Models/User.swift:
--------------------------------------------------------------------------------
1 | //
2 | // User.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct User: Hashable {
12 | var name: String
13 | var avatar: String
14 | var isCurrentUser: Bool = false
15 | }
16 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/View/ChatView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct ChatView: View {
12 | @State var typingMessage: String = ""
13 | @EnvironmentObject var chatHelper: ChatHelper
14 | @ObservedObject private var keyboard = KeyboardResponder()
15 |
16 | init() {
17 | UITableView.appearance().separatorStyle = .none
18 | UITableView.appearance().tableFooterView = UIView()
19 | }
20 |
21 | var body: some View {
22 | NavigationView {
23 | VStack {
24 | List {
25 | ForEach(chatHelper.realTimeMessages, id: \.self) { msg in
26 | MessageView(currentMessage: msg)
27 | }
28 | }
29 | HStack {
30 | TextField("Message...", text: $typingMessage)
31 | .textFieldStyle(RoundedBorderTextFieldStyle())
32 | .frame(minHeight: CGFloat(30))
33 | Button(action: sendMessage) {
34 | Text("Send")
35 | }
36 | }.frame(minHeight: CGFloat(50)).padding()
37 | }.navigationBarTitle(Text(DataSource.firstUser.name), displayMode: .inline)
38 | .padding(.bottom, keyboard.currentHeight)
39 | .edgesIgnoringSafeArea(keyboard.currentHeight == 0.0 ? .leading: .bottom)
40 | }.onTapGesture {
41 | self.endEditing(true)
42 | }
43 | }
44 |
45 | func sendMessage() {
46 | chatHelper.sendMessage(Message(content: typingMessage, user: DataSource.secondUser))
47 | typingMessage = ""
48 | }
49 | }
50 |
51 | struct ChatView_Previews: PreviewProvider {
52 | static var previews: some View {
53 | ChatView()
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/View/ContentMessageView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentMessageView.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct ContentMessageView: View {
12 | var contentMessage: String
13 | var isCurrentUser: Bool
14 |
15 | var body: some View {
16 | Text(contentMessage)
17 | .padding(10)
18 | .foregroundColor(isCurrentUser ? Color.white : Color.black)
19 | .background(isCurrentUser ? Color.blue : Color(UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0)))
20 | .cornerRadius(10)
21 | }
22 | }
23 |
24 | struct ContentMessageView_Previews: PreviewProvider {
25 | static var previews: some View {
26 | ContentMessageView(contentMessage: "Hi, I am your friend", isCurrentUser: false)
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Tutorials/ChatViewTutorial/ChatViewTutorial/View/MessageView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MessageView.swift
3 | // ChatViewTutorial
4 | //
5 | // Created by Duy Bui on 2/2/20.
6 | // Copyright © 2020 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct MessageView : View {
12 | var currentMessage: Message
13 | var body: some View {
14 | HStack(alignment: .bottom, spacing: 15) {
15 | if !currentMessage.user.isCurrentUser {
16 | Image(currentMessage.user.avatar)
17 | .resizable()
18 | .frame(width: 40, height: 40, alignment: .center)
19 | .cornerRadius(20)
20 | } else {
21 | Spacer()
22 | }
23 | ContentMessageView(contentMessage: currentMessage.content,
24 | isCurrentUser: currentMessage.user.isCurrentUser)
25 | }.padding()
26 | }
27 | }
28 |
29 | struct MessageView_Previews: PreviewProvider {
30 | static var previews: some View {
31 | MessageView(currentMessage: Message(content: "There are a lot of premium iOS templates on iosapptemplates.com", user: DataSource.secondUser))
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/xcuserdata/duybui.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | FirebaseCloudStorageInSwiftUI.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 10
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/xcuserdata/duybui.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // FirebaseCloudStorageInSwiftUI
4 | //
5 | // Created by Duy Bui on 8/13/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import FirebaseCore
11 | import Firebase
12 |
13 | @UIApplicationMain
14 | class AppDelegate: UIResponder, UIApplicationDelegate {
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | FirebaseApp.configure()
19 | return true
20 | }
21 |
22 | // MARK: UISceneSession Lifecycle
23 |
24 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
25 | // Called when a new scene session is being created.
26 | // Use this method to select a configuration to create the new scene with.
27 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
28 | }
29 |
30 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
31 | // Called when the user discards a scene session.
32 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
33 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
34 | }
35 |
36 |
37 | }
38 |
39 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // FirebaseCloudStorageInSwiftUI
4 | //
5 | // Created by Duy Bui on 8/13/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import FirebaseStorage
11 |
12 | struct ContentView: View {
13 | @State var isShown = false
14 |
15 | var body: some View {
16 | Button(action: { self.isShown.toggle() }) {
17 | Text("Upload Image")
18 | }.sheet(isPresented: $isShown) {
19 | ImagePickerView(isShown: self.$isShown)
20 | }
21 | }
22 | }
23 |
24 | struct ContentView_Previews: PreviewProvider {
25 | static var previews: some View {
26 | ContentView()
27 | }
28 | }
29 |
30 | struct ImagePickerView: UIViewControllerRepresentable {
31 |
32 | @Binding var isShown: Bool
33 |
34 | func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIImagePickerController {
35 | let imagePicker = UIImagePickerController()
36 | imagePicker.delegate = context.coordinator
37 | imagePicker.sourceType = .photoLibrary
38 | return imagePicker
39 | }
40 |
41 | func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext) {}
42 |
43 | func makeCoordinator() -> Coordinator {
44 | return Coordinator(imagePicker: self)
45 | }
46 | }
47 |
48 | extension ImagePickerView {
49 |
50 | class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
51 | var imagePicker: ImagePickerView
52 | init(imagePicker: ImagePickerView) {
53 | self.imagePicker = imagePicker
54 | }
55 |
56 | func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
57 | imagePicker.isShown.toggle()
58 | }
59 |
60 | func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
61 | guard let image = info[.originalImage] as? UIImage,
62 | let data = image.jpegData(compressionQuality: 0.4) else { return }
63 | let storage = Storage.storage()
64 | storage.reference().child("temp").putData(data, metadata: nil) { (_, error) in
65 | if error != nil {
66 | print(error?.localizedDescription)
67 | return
68 | }
69 | print("Uploaded Successfully")
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/GoogleService-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CLIENT_ID
6 | 995639030608-vtmhti5ubh7d9n38h6ef9cu3ro641us3.apps.googleusercontent.com
7 | REVERSED_CLIENT_ID
8 | com.googleusercontent.apps.995639030608-vtmhti5ubh7d9n38h6ef9cu3ro641us3
9 | API_KEY
10 | AIzaSyBKL8eiWFd5eaogj6rIrG814Bl-J5gUUFw
11 | GCM_SENDER_ID
12 | 995639030608
13 | PLIST_VERSION
14 | 1
15 | BUNDLE_ID
16 | iosapptemplate.tutorial.FirebaseCloudStorageInSwiftUI
17 | PROJECT_ID
18 | testing-duybui
19 | STORAGE_BUCKET
20 | testing-duybui.appspot.com
21 | IS_ADS_ENABLED
22 |
23 | IS_ANALYTICS_ENABLED
24 |
25 | IS_APPINVITE_ENABLED
26 |
27 | IS_GCM_ENABLED
28 |
29 | IS_SIGNIN_ENABLED
30 |
31 | GOOGLE_APP_ID
32 | 1:995639030608:ios:beb1a2ba74905805cd3255
33 | DATABASE_URL
34 | https://testing-duybui.firebaseio.com
35 |
36 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // FirebaseCloudStorageInSwiftUI
4 | //
5 | // Created by Duy Bui on 8/13/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 |
22 | // Create the SwiftUI view that provides the window contents.
23 | let contentView = ContentView()
24 |
25 | // Use a UIHostingController as window root view controller.
26 | if let windowScene = scene as? UIWindowScene {
27 | let window = UIWindow(windowScene: windowScene)
28 | window.rootViewController = UIHostingController(rootView: contentView)
29 | self.window = window
30 | window.makeKeyAndVisible()
31 | }
32 | }
33 |
34 | func sceneDidDisconnect(_ scene: UIScene) {
35 | // Called as the scene is being released by the system.
36 | // This occurs shortly after the scene enters the background, or when its session is discarded.
37 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
39 | }
40 |
41 | func sceneDidBecomeActive(_ scene: UIScene) {
42 | // Called when the scene has moved from an inactive state to an active state.
43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
44 | }
45 |
46 | func sceneWillResignActive(_ scene: UIScene) {
47 | // Called when the scene will move from an active state to an inactive state.
48 | // This may occur due to temporary interruptions (ex. an incoming phone call).
49 | }
50 |
51 | func sceneWillEnterForeground(_ scene: UIScene) {
52 | // Called as the scene transitions from the background to the foreground.
53 | // Use this method to undo the changes made on entering the background.
54 | }
55 |
56 | func sceneDidEnterBackground(_ scene: UIScene) {
57 | // Called as the scene transitions from the foreground to the background.
58 | // Use this method to save data, release shared resources, and store enough scene-specific state information
59 | // to restore the scene back to its current state.
60 | }
61 |
62 |
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/Tutorials/FirebaseCloudStorageInSwiftUI/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'FirebaseCloudStorageInSwiftUI' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 | pod 'Firebase/Storage'
8 | # Pods for FirebaseCloudStorageInSwiftUI
9 |
10 | end
11 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/xcuserdata/duybui.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | LoginScreenTutorial.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // LoginScreenTutorial
4 | //
5 | // Created by Duy Bui on 11/9/19.
6 | // Copyright © 2019 iosAppTemplates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/iosapptemplate.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "iosapptemplate.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/iosapptemplate.imageset/iosapptemplate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/iosapptemplate.imageset/iosapptemplate.png
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // LoginScreenTutorial
4 | //
5 | // Created by Duy Bui on 11/9/19.
6 | // Copyright © 2019 iosAppTemplates. All rights reserved.
7 | //
8 | import SwiftUI
9 |
10 | struct LoginView: View {
11 | // MARK: - Propertiers
12 | @State private var email = ""
13 | @State private var password = ""
14 |
15 | // MARK: - View
16 | var body: some View {
17 | VStack() {
18 | Text("iOS App Templates")
19 | .font(.largeTitle).foregroundColor(Color.white)
20 | .padding([.top, .bottom], 40)
21 | .shadow(radius: 10.0, x: 20, y: 10)
22 |
23 | Image("iosapptemplate")
24 | .resizable()
25 | .frame(width: 250, height: 250)
26 | .clipShape(Circle())
27 | .overlay(Circle().stroke(Color.white, lineWidth: 4))
28 | .shadow(radius: 10.0, x: 20, y: 10)
29 | .padding(.bottom, 50)
30 |
31 | VStack(alignment: .leading, spacing: 15) {
32 | TextField("Email", text: self.$email)
33 | .padding()
34 | .background(Color.themeTextField)
35 | .cornerRadius(20.0)
36 | .shadow(radius: 10.0, x: 20, y: 10)
37 |
38 | SecureField("Password", text: self.$password)
39 | .padding()
40 | .background(Color.themeTextField)
41 | .cornerRadius(20.0)
42 | .shadow(radius: 10.0, x: 20, y: 10)
43 | }.padding([.leading, .trailing], 27.5)
44 |
45 | Button(action: {}) {
46 | Text("Sign In")
47 | .font(.headline)
48 | .foregroundColor(.white)
49 | .padding()
50 | .frame(width: 300, height: 50)
51 | .background(Color.green)
52 | .cornerRadius(15.0)
53 | .shadow(radius: 10.0, x: 20, y: 10)
54 | }.padding(.top, 50)
55 |
56 | Spacer()
57 | HStack(spacing: 0) {
58 | Text("Don't have an account? ")
59 | Button(action: {}) {
60 | Text("Sign Up")
61 | .foregroundColor(.black)
62 | }
63 | }
64 | }
65 | .background(
66 | LinearGradient(gradient: Gradient(colors: [.purple, .blue]), startPoint: .top, endPoint: .bottom)
67 | .edgesIgnoringSafeArea(.all))
68 |
69 | }
70 | }
71 |
72 | extension Color {
73 | static var themeTextField: Color {
74 | return Color(red: 220.0/255.0, green: 230.0/255.0, blue: 230.0/255.0, opacity: 1.0)
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/LoginScreenTutorial/LoginScreenTutorial/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // LoginScreenTutorial
4 | //
5 | // Created by Duy Bui on 11/9/19.
6 | // Copyright © 2019 iosAppTemplates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
20 |
21 | // Create the SwiftUI view that provides the window contents.
22 | let contentView = LoginView()
23 |
24 | // Use a UIHostingController as window root view controller.
25 | if let windowScene = scene as? UIWindowScene {
26 | let window = UIWindow(windowScene: windowScene)
27 | window.rootViewController = UIHostingController(rootView: contentView)
28 | self.window = window
29 | window.makeKeyAndVisible()
30 | }
31 | }
32 |
33 | func sceneDidDisconnect(_ scene: UIScene) {
34 | // Called as the scene is being released by the system.
35 | // This occurs shortly after the scene enters the background, or when its session is discarded.
36 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
37 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
38 | }
39 |
40 | func sceneDidBecomeActive(_ scene: UIScene) {
41 | // Called when the scene has moved from an inactive state to an active state.
42 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
43 | }
44 |
45 | func sceneWillResignActive(_ scene: UIScene) {
46 | // Called when the scene will move from an active state to an inactive state.
47 | // This may occur due to temporary interruptions (ex. an incoming phone call).
48 | }
49 |
50 | func sceneWillEnterForeground(_ scene: UIScene) {
51 | // Called as the scene transitions from the background to the foreground.
52 | // Use this method to undo the changes made on entering the background.
53 | }
54 |
55 | func sceneDidEnterBackground(_ scene: UIScene) {
56 | // Called as the scene transitions from the foreground to the background.
57 | // Use this method to save data, release shared resources, and store enough scene-specific state information
58 | // to restore the scene back to its current state.
59 | }
60 |
61 |
62 | }
63 |
64 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/xcuserdata/duybui.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | MapViewTutorial.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 30FC2847236B9D3E00DF476E
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // MapViewTutorial
4 | //
5 | // Created by Duy Bui on 11/1/19.
6 | // Copyright © 2019 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
15 | // Override point for customization after application launch.
16 | return true
17 | }
18 |
19 | // MARK: UISceneSession Lifecycle
20 |
21 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
22 | // Called when a new scene session is being created.
23 | // Use this method to select a configuration to create the new scene with.
24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
25 | }
26 |
27 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
28 | // Called when the user discards a scene session.
29 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
30 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
31 | }
32 |
33 |
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // MapViewTutorial
4 | //
5 | // Created by Duy Bui on 11/1/19.
6 | // Copyright © 2019 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import MapKit
11 |
12 | struct MapView: UIViewRepresentable {
13 |
14 | var locationManager = CLLocationManager()
15 | func setupManager() {
16 | locationManager.desiredAccuracy = kCLLocationAccuracyBest
17 | locationManager.requestWhenInUseAuthorization()
18 | locationManager.requestAlwaysAuthorization()
19 | }
20 |
21 | func makeUIView(context: Context) -> MKMapView {
22 | setupManager()
23 | let mapView = MKMapView(frame: UIScreen.main.bounds)
24 | mapView.showsUserLocation = true
25 | mapView.userTrackingMode = .follow
26 | return mapView
27 | }
28 |
29 | func updateUIView(_ uiView: MKMapView, context: Context) {
30 | }
31 | }
32 |
33 | struct ContentView: View {
34 | var body: some View {
35 | MapView()
36 | }
37 | }
38 |
39 | struct ContentView_Previews: PreviewProvider {
40 | static var previews: some View {
41 | ContentView()
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | NSLocationWhenInUseUsageDescription
8 | Tell users why they need to provide this
9 | NSLocationAlwaysAndWhenInUseUsageDescription
10 | Tell users why they need to provide this
11 | CFBundleExecutable
12 | $(EXECUTABLE_NAME)
13 | CFBundleIdentifier
14 | $(PRODUCT_BUNDLE_IDENTIFIER)
15 | CFBundleInfoDictionaryVersion
16 | 6.0
17 | CFBundleName
18 | $(PRODUCT_NAME)
19 | CFBundlePackageType
20 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
21 | CFBundleShortVersionString
22 | 1.0
23 | CFBundleVersion
24 | 1
25 | LSRequiresIPhoneOS
26 |
27 | UIApplicationSceneManifest
28 |
29 | UIApplicationSupportsMultipleScenes
30 |
31 | UISceneConfigurations
32 |
33 | UIWindowSceneSessionRoleApplication
34 |
35 |
36 | UISceneConfigurationName
37 | Default Configuration
38 | UISceneDelegateClassName
39 | $(PRODUCT_MODULE_NAME).SceneDelegate
40 |
41 |
42 |
43 |
44 | UILaunchStoryboardName
45 | LaunchScreen
46 | UIRequiredDeviceCapabilities
47 |
48 | armv7
49 |
50 | UISupportedInterfaceOrientations
51 |
52 | UIInterfaceOrientationPortrait
53 | UIInterfaceOrientationLandscapeLeft
54 | UIInterfaceOrientationLandscapeRight
55 |
56 | UISupportedInterfaceOrientations~ipad
57 |
58 | UIInterfaceOrientationPortrait
59 | UIInterfaceOrientationPortraitUpsideDown
60 | UIInterfaceOrientationLandscapeLeft
61 | UIInterfaceOrientationLandscapeRight
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/MapViewAdvance.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MapViewAdvance.swift
3 | // MapViewTutorial
4 | //
5 | // Created by Duy Bui on 11/1/19.
6 | // Copyright © 2019 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import MapKit
11 |
12 | final class Checkpoint: NSObject, MKAnnotation {
13 | let title: String?
14 | let coordinate: CLLocationCoordinate2D
15 |
16 | init(title: String?, coordinate: CLLocationCoordinate2D) {
17 | self.title = title
18 | self.coordinate = coordinate
19 | }
20 | }
21 |
22 | struct MapViewAdvance: UIViewRepresentable {
23 | @Binding var checkpoints: [Checkpoint]
24 |
25 | func makeUIView(context: Context) -> MKMapView {
26 | MKMapView()
27 | }
28 |
29 | func updateUIView(_ uiView: MKMapView, context: Context) {
30 | uiView.addAnnotations(checkpoints)
31 | }
32 | }
33 |
34 | struct ContentViewAdvance: View {
35 | @State var checkpoints: [Checkpoint] = [
36 | Checkpoint(title: "Da Nang", coordinate: .init(latitude: 16.047079, longitude: 108.206230)),
37 | Checkpoint(title: "Ha Noi", coordinate: .init(latitude: 21.027763, longitude: 105.834160))
38 | ]
39 |
40 | var body: some View {
41 | MapViewAdvance(checkpoints: $checkpoints)
42 | }
43 | }
44 |
45 | struct ContentViewAdvance_Previews: PreviewProvider {
46 | static var previews: some View {
47 | ContentViewAdvance()
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/Tutorials/MapViewTutorial/MapViewTutorial/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // NavigationDrawerTutorial
4 | //
5 | // Created by Duy Bui on 10/25/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // NavigationDrawerTutorial
4 | //
5 | // Created by Duy Bui on 10/25/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct DrawerContent: View {
12 | var body: some View {
13 | Color.blue
14 | }
15 | }
16 |
17 | struct NavigationDrawer: View {
18 | private let width = UIScreen.main.bounds.width - 100
19 | @Binding var isOpen: Bool
20 |
21 | var body: some View {
22 | HStack {
23 | DrawerContent()
24 | .frame(width: self.width)
25 | .offset(x: self.isOpen ? 0 : -self.width)
26 | .animation(.default)
27 | Spacer()
28 | }.onTapGesture {
29 | self.isOpen.toggle()
30 | }
31 | }
32 | }
33 |
34 | struct ContentView: View {
35 | @State var isDrawerOpen: Bool = false
36 |
37 | var body: some View {
38 | ZStack {
39 | NavigationView {
40 | EmptyView()
41 | .navigationBarTitle(Text("Navigation Drawer"))
42 | .navigationBarItems(leading: Button(action: {
43 | self.isDrawerOpen.toggle()
44 | }) {
45 | Image(systemName: "sidebar.left")
46 | })
47 | }
48 |
49 | NavigationDrawer(isOpen: self.$isDrawerOpen)
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // NavigationDrawerTutorial
4 | //
5 | // Created by Duy Bui on 10/25/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 |
22 | // Create the SwiftUI view that provides the window contents.
23 | let contentView = ContentView()
24 |
25 | // Use a UIHostingController as window root view controller.
26 | if let windowScene = scene as? UIWindowScene {
27 | let window = UIWindow(windowScene: windowScene)
28 | window.rootViewController = UIHostingController(rootView: contentView)
29 | self.window = window
30 | window.makeKeyAndVisible()
31 | }
32 | }
33 |
34 | func sceneDidDisconnect(_ scene: UIScene) {
35 | // Called as the scene is being released by the system.
36 | // This occurs shortly after the scene enters the background, or when its session is discarded.
37 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
39 | }
40 |
41 | func sceneDidBecomeActive(_ scene: UIScene) {
42 | // Called when the scene has moved from an inactive state to an active state.
43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
44 | }
45 |
46 | func sceneWillResignActive(_ scene: UIScene) {
47 | // Called when the scene will move from an active state to an inactive state.
48 | // This may occur due to temporary interruptions (ex. an incoming phone call).
49 | }
50 |
51 | func sceneWillEnterForeground(_ scene: UIScene) {
52 | // Called as the scene transitions from the background to the foreground.
53 | // Use this method to undo the changes made on entering the background.
54 | }
55 |
56 | func sceneDidEnterBackground(_ scene: UIScene) {
57 | // Called as the scene transitions from the foreground to the background.
58 | // Use this method to save data, release shared resources, and store enough scene-specific state information
59 | // to restore the scene back to its current state.
60 | }
61 |
62 |
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/xcuserdata/duybui.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | SwiftUICombineMVVM.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // SwiftUICombineMVVM
4 | //
5 | // Created by Duy Bui on 7/30/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/beer.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "beer.jpg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/beer.imageset/beer.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/beer.imageset/beer.jpg
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/BreweriesView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BreweriesView.swift
3 | // SwiftUICombineMVVM
4 | //
5 | // Created by Duy Bui on 7/30/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct BreweriesView: View {
12 | @ObservedObject var viewModel = BreweriesViewModel()
13 | var body: some View {
14 | NavigationView {
15 | List(viewModel.breweries, id: \.self) {
16 | BreweryView(brewery: $0)
17 | }.navigationBarTitle("Breweries")
18 | .onAppear {
19 | self.viewModel.fetchBreweries()
20 | }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/BreweriesViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BreweriesViewModel.swift
3 | // SwiftUICombineMVVM
4 | //
5 | // Created by Duy Bui on 7/30/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import Combine
10 | import SwiftUI
11 |
12 | class BreweriesViewModel: ObservableObject {
13 | private let url = "https://api.openbrewerydb.org/breweries"
14 | private var task: AnyCancellable?
15 |
16 | @Published var breweries: [Brewery] = []
17 |
18 | func fetchBreweries() {
19 | task = URLSession.shared.dataTaskPublisher(for: URL(string: url)!)
20 | .map { $0.data }
21 | .decode(type: [Brewery].self, decoder: JSONDecoder())
22 | .replaceError(with: [])
23 | .eraseToAnyPublisher()
24 | .receive(on: RunLoop.main)
25 | .assign(to: \BreweriesViewModel.breweries, on: self)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Brewery.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Brewery.swift
3 | // SwiftUICombineMVVM
4 | //
5 | // Created by Duy Bui on 7/30/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct Brewery: Decodable, Hashable {
12 | let name: String
13 | let street: String
14 | let city: String
15 | }
16 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/BreweryView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BreweryView.swift
3 | // SwiftUICombineMVVM
4 | //
5 | // Created by Duy Bui on 7/30/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct BreweryView: View {
12 | private let brewery: Brewery
13 | init(brewery: Brewery) {
14 | self.brewery = brewery
15 | }
16 |
17 | var body: some View {
18 | HStack {
19 | Image(uiImage: UIImage(named: "beer")!)
20 | .resizable()
21 | .scaledToFit()
22 | .frame(width: 80, height: 80)
23 | VStack(alignment: .leading, spacing: 15) {
24 | Text(brewery.name)
25 | .font(.system(size: 18))
26 | .foregroundColor(Color.blue)
27 | Text("\(brewery.city) - \(brewery.street)")
28 | .font(.system(size: 14))
29 | }
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // SwiftUICombineMVVM
4 | //
5 | // Created by Duy Bui on 7/30/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 |
22 | // Create the SwiftUI view that provides the window contents.
23 | let contentView = BreweriesView()
24 |
25 | // Use a UIHostingController as window root view controller.
26 | if let windowScene = scene as? UIWindowScene {
27 | let window = UIWindow(windowScene: windowScene)
28 | window.rootViewController = UIHostingController(rootView: contentView)
29 | self.window = window
30 | window.makeKeyAndVisible()
31 | }
32 | }
33 |
34 | func sceneDidDisconnect(_ scene: UIScene) {
35 | // Called as the scene is being released by the system.
36 | // This occurs shortly after the scene enters the background, or when its session is discarded.
37 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
39 | }
40 |
41 | func sceneDidBecomeActive(_ scene: UIScene) {
42 | // Called when the scene has moved from an inactive state to an active state.
43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
44 | }
45 |
46 | func sceneWillResignActive(_ scene: UIScene) {
47 | // Called when the scene will move from an active state to an inactive state.
48 | // This may occur due to temporary interruptions (ex. an incoming phone call).
49 | }
50 |
51 | func sceneWillEnterForeground(_ scene: UIScene) {
52 | // Called as the scene transitions from the background to the foreground.
53 | // Use this method to undo the changes made on entering the background.
54 | }
55 |
56 | func sceneDidEnterBackground(_ scene: UIScene) {
57 | // Called as the scene transitions from the foreground to the background.
58 | // Use this method to save data, release shared resources, and store enough scene-specific state information
59 | // to restore the scene back to its current state.
60 | }
61 |
62 |
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // TabbedViewTutorial
4 | //
5 | // Created by Duy Bui on 10/25/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // TabbedViewTutorial
4 | //
5 | // Created by Duy Bui on 10/25/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct ContentView: View {
12 | var body: some View {
13 | TabView {
14 | RedView()
15 | .tabItem {
16 | Image(systemName: "phone.fill")
17 | Text("First Tab")
18 | }
19 |
20 | BlueView()
21 | .tabItem {
22 | Image(systemName: "tv.fill")
23 | Text("Second Tab")
24 | }
25 | }
26 | }
27 | }
28 |
29 | struct RedView: View {
30 | var body: some View {
31 | Color.red
32 | }
33 | }
34 |
35 | struct BlueView: View {
36 | var body: some View {
37 | Color.blue
38 | }
39 | }
40 |
41 | struct ContentView_Previews: PreviewProvider {
42 | static var previews: some View {
43 | ContentView()
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tutorials/TabbedViewTutorial/TabbedViewTutorial/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // TabbedViewTutorial
4 | //
5 | // Created by Duy Bui on 10/25/19.
6 | // Copyright © 2019 Duy Bui. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 |
22 | // Create the SwiftUI view that provides the window contents.
23 | let contentView = ContentView()
24 |
25 | // Use a UIHostingController as window root view controller.
26 | if let windowScene = scene as? UIWindowScene {
27 | let window = UIWindow(windowScene: windowScene)
28 | window.rootViewController = UIHostingController(rootView: contentView)
29 | self.window = window
30 | window.makeKeyAndVisible()
31 | }
32 | }
33 |
34 | func sceneDidDisconnect(_ scene: UIScene) {
35 | // Called as the scene is being released by the system.
36 | // This occurs shortly after the scene enters the background, or when its session is discarded.
37 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
39 | }
40 |
41 | func sceneDidBecomeActive(_ scene: UIScene) {
42 | // Called when the scene has moved from an inactive state to an active state.
43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
44 | }
45 |
46 | func sceneWillResignActive(_ scene: UIScene) {
47 | // Called when the scene will move from an active state to an inactive state.
48 | // This may occur due to temporary interruptions (ex. an incoming phone call).
49 | }
50 |
51 | func sceneWillEnterForeground(_ scene: UIScene) {
52 | // Called as the scene transitions from the background to the foreground.
53 | // Use this method to undo the changes made on entering the background.
54 | }
55 |
56 | func sceneDidEnterBackground(_ scene: UIScene) {
57 | // Called as the scene transitions from the foreground to the background.
58 | // Use this method to save data, release shared resources, and store enough scene-specific state information
59 | // to restore the scene back to its current state.
60 | }
61 |
62 |
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrcflorian/swiftUI-tutorials/6ac2b6a05087472dcf0853033a01e4a3a76fc4c3/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/xcuserdata/duybui.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/xcuserdata/duybui.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | TheHorizontalProgressBarView.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // TheHorizontalProgressBarView
4 | //
5 | // Created by Duy Bui on 5/9/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // TheHorizontalProgressBarView
4 | //
5 | // Created by iOS App Templates on 5/9/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct HorizontalProgressBarView: View {
12 | @Binding var currentProgressValue: CGFloat
13 | let width: CGFloat
14 | let height: CGFloat
15 |
16 | var body: some View {
17 | ZStack(alignment: .leading) {
18 | Rectangle()
19 | .fill(Color.gray)
20 | Rectangle()
21 | .fill(Color.purple)
22 | .frame(width: min(width, currentProgressValue*width))
23 | }.cornerRadius(30.0)
24 | .frame(width: width, height: height)
25 | }
26 | }
27 |
28 | struct ContentView: View {
29 | @State var currentProgressValue: CGFloat = 0.0
30 |
31 | var body: some View {
32 | HorizontalProgressBarView(currentProgressValue: $currentProgressValue,
33 | width: 300,
34 | height: 10)
35 | }
36 | }
37 |
38 | struct ContentView_Previews: PreviewProvider {
39 | static var previews: some View {
40 | ContentView()
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // TheHorizontalProgressBarView
4 | //
5 | // Created by Duy Bui on 5/9/20.
6 | // Copyright © 2020 iOS App Templates. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 |
22 | // Create the SwiftUI view that provides the window contents.
23 | let contentView = ContentView()
24 |
25 | // Use a UIHostingController as window root view controller.
26 | if let windowScene = scene as? UIWindowScene {
27 | let window = UIWindow(windowScene: windowScene)
28 | window.rootViewController = UIHostingController(rootView: contentView)
29 | self.window = window
30 | window.makeKeyAndVisible()
31 | }
32 | }
33 |
34 | func sceneDidDisconnect(_ scene: UIScene) {
35 | // Called as the scene is being released by the system.
36 | // This occurs shortly after the scene enters the background, or when its session is discarded.
37 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
39 | }
40 |
41 | func sceneDidBecomeActive(_ scene: UIScene) {
42 | // Called when the scene has moved from an inactive state to an active state.
43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
44 | }
45 |
46 | func sceneWillResignActive(_ scene: UIScene) {
47 | // Called when the scene will move from an active state to an inactive state.
48 | // This may occur due to temporary interruptions (ex. an incoming phone call).
49 | }
50 |
51 | func sceneWillEnterForeground(_ scene: UIScene) {
52 | // Called as the scene transitions from the background to the foreground.
53 | // Use this method to undo the changes made on entering the background.
54 | }
55 |
56 | func sceneDidEnterBackground(_ scene: UIScene) {
57 | // Called as the scene transitions from the foreground to the background.
58 | // Use this method to save data, release shared resources, and store enough scene-specific state information
59 | // to restore the scene back to its current state.
60 | }
61 |
62 |
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | CameraAndGalleryTutorial.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/AppDelegate.swift.md:
--------------------------------------------------------------------------------
1 | # AppDelegate
2 |
3 | ## Overview
4 | AppDelegate is a class that handles the application's life cycle events. It is a subclass of `UIResponder` and conforms to the `UIApplicationDelegate` protocol.
5 |
6 | ## Props
7 | None
8 |
9 | ## Variables
10 | None
11 |
12 | ## Methods
13 |
14 | ### application(_:didFinishLaunchingWithOptions:)
15 | This method is called when the application has finished launching. This is a great place to do any initial setup.
16 |
17 | ### application(_:configurationForConnecting:options:)
18 | This method is called when a new scene session is being created. Use this method to select a configuration to create the new scene with.
19 |
20 | ### application(_:didDiscardSceneSessions:)
21 | This method is called when the user discards a scene session. Use this method to release any resources that were specific to the discarded scenes.
22 |
23 | ## Usage
24 | The AppDelegate should not be used directly, but is used by the system to handle application life cycle events.
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/AppIcon.appiconset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/ContentView.swift.md:
--------------------------------------------------------------------------------
1 | # CameraAndGallery Tutorial
2 |
3 | ## Overview
4 | This tutorial will demonstrate how to use SwiftUI to create a simple app that allows users to access their camera or image gallery to take pictures and save them.
5 |
6 | ## Props
7 | - `isShown` is a `Binding` that is used to determine if the camera and gallery view should be shown.
8 | - `image` is a `Binding` that holds the image that was selected by the user.
9 |
10 | ## Variables
11 | - `picker` is an `UIImagePickerController` which is used to select an image from the camera or image gallery.
12 |
13 | ## Methods
14 | - `makeCoordinator` is used to create a new `Coordinator` object. This is used to handle the image selection.
15 | - `makeUIViewController` is used to create and configure the `UIImagePickerController`.
16 | - `updateUIViewController` is used to update the `UIImagePickerController` when the view changes.
17 |
18 | ## Usage
19 | To use this tutorial, create a new SwiftUI project and add the `CaptureImageView` struct to the `ContentView`. Then, add a `Button` to the `ContentView` to trigger the camera and gallery view and a `Image` to display the selected image. Finally, bind the `isShown` and `image` props to the view's state.
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Coordinator.swift.md:
--------------------------------------------------------------------------------
1 | # Coordinator
2 |
3 | ## Overview
4 | The Coordinator class is a SwiftUI class used to implement the UIImagePickerControllerDelegate and UINavigationControllerDelegate protocols. This class is used to provide a way to select an image from the device's photo library or camera.
5 |
6 | ## Props
7 | | Prop | Description |
8 | | ---- | ----------- |
9 | | isCoordinatorShown | A binding boolean value that is used to determine if the coordinator is shown or not. |
10 | | imageInCoordinator | A binding image value that is used to store the image that is selected from the device's photo library or camera. |
11 |
12 | ## Variables
13 | None
14 |
15 | ## Methods
16 | | Method | Description |
17 | | ------ | ----------- |
18 | | imagePickerController(_:didFinishPickingMediaWithInfo:) | This method is used to assign the selected image to the imageInCoordinator binding and set isCoordinatorShown to false when an image is selected. |
19 | | imagePickerControllerDidCancel(_:) | This method is used to set isCoordinatorShown to false when the user cancels the selection. |
20 |
21 | ## Usage
22 | The Coordinator class is used to select an image from the device's photo library or camera. To use this class, create an instance of Coordinator and pass in the binding value of isCoordinatorShown and imageInCoordinator. Then call the instance of Coordinator in the body of a view and assign the instance to the imagePickerController property of an instance of UIImagePickerController.
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/README.md:
--------------------------------------------------------------------------------
1 | CameraAndGalleryTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/SceneDelegate.swift.md:
--------------------------------------------------------------------------------
1 | # SceneDelegate.swift
2 |
3 | ## Overview
4 | This class handles the initialization of the rootViewController of the scene. It is also responsible for managing the lifecycle of the app when it enters the background and foreground.
5 |
6 | ## Props
7 | ```swift
8 | var window: UIWindow?
9 | ```
10 |
11 | ## Variables
12 | None
13 |
14 | ## Methods
15 | ```swift
16 | scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
17 | ```
18 | This method is called when the scene is about to be connected to a session. It is used to configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 |
20 | ```swift
21 | sceneDidDisconnect(_ scene: UIScene)
22 | ```
23 | This method is called when the scene is being released by the system. It is used to release any resources associated with the scene that can be re-created the next time the scene connects.
24 |
25 | ```swift
26 | sceneDidBecomeActive(_ scene: UIScene)
27 | ```
28 | This method is called when the scene has moved from an inactive state to an active state. It is used to restart any tasks that were paused (or not yet started) when the scene was inactive.
29 |
30 | ```swift
31 | sceneWillResignActive(_ scene: UIScene)
32 | ```
33 | This method is called when the scene will move from an active state to an inactive state. It is used to save data and release shared resources.
34 |
35 | ```swift
36 | sceneWillEnterForeground(_ scene: UIScene)
37 | ```
38 | This method is called as the scene transitions from the background to the foreground. It is used to undo the changes made on entering the background.
39 |
40 | ```swift
41 | sceneDidEnterBackground(_ scene: UIScene)
42 | ```
43 | This method is called as the scene transitions from the foreground to the background. It is used to save data, release shared resources, and store enough scene-specific state information to restore the scene back to its current state.
44 |
45 | ## Usage
46 | The SceneDelegate class is used to manage the lifecycle of the app when it is being connected to a session, entering the background and foreground, and disconnecting from a session. It is also used to configure and attach the UIWindow to the scene.
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppDelegate.swift](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/AppDelegate.swift)
4 | - [Assets.xcassets](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Assets.xcassets/)
5 | - [Base.lproj](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Base.lproj/)
6 | - [ContentView.swift](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/ContentView.swift)
7 | - [Coordinator.swift](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Coordinator.swift)
8 | - [Preview Content](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/Preview Content/)
9 | - [SceneDelegate.swift](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/SceneDelegate.swift)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/README.md:
--------------------------------------------------------------------------------
1 | CameraAndGalleryTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/CameraAndGalleryTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [CameraAndGalleryTutorial](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial/)
4 | - [CameraAndGalleryTutorial.xcodeproj](Tutorials/CameraAndGalleryTutorial/CameraAndGalleryTutorial.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | ChatViewTutorial.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/AppDelegate.swift.md:
--------------------------------------------------------------------------------
1 | # AppDelegate
2 |
3 | ## Overview
4 | AppDelegate is the main entry point of the application. It is responsible for managing the life cycle of the application. It handles events such as application launch, background execution, termination, and more.
5 |
6 | ## Props
7 | None
8 |
9 | ## Variables
10 | None
11 |
12 | ## Methods
13 |
14 | ### application:didFinishLaunchingWithOptions
15 | This method is called when the application has finished launching. It is responsible for setting up the application and returning true if the launch was successful.
16 |
17 | ### application:configurationForConnecting
18 | This method is called when a new scene session is being created. It is responsible for returning the configuration for the new scene.
19 |
20 | ### application:didDiscardSceneSessions
21 | This method is called when the user discards a scene session. It is responsible for releasing any resources that were specific to the discarded scene.
22 |
23 | ## Usage
24 | The AppDelegate should be used to handle the application life cycle events. It is responsible for setting up the application and releasing resources when necessary.
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/AppIcon.appiconset/)
4 | - [lady.imageset](Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/lady.imageset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/lady.imageset/README.md:
--------------------------------------------------------------------------------
1 | lady.imageset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/lady.imageset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Helper/README.md:
--------------------------------------------------------------------------------
1 | Helper
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Helper/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Models/README.md:
--------------------------------------------------------------------------------
1 | Models
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Models/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/ChatViewTutorial/ChatViewTutorial/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/README.md:
--------------------------------------------------------------------------------
1 | ChatViewTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/View/README.md:
--------------------------------------------------------------------------------
1 | View
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/View/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/ChatViewTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppDelegate.swift](Tutorials/ChatViewTutorial/ChatViewTutorial/AppDelegate.swift)
4 | - [Assets.xcassets](Tutorials/ChatViewTutorial/ChatViewTutorial/Assets.xcassets/)
5 | - [Base.lproj](Tutorials/ChatViewTutorial/ChatViewTutorial/Base.lproj/)
6 | - [Helper](Tutorials/ChatViewTutorial/ChatViewTutorial/Helper/)
7 | - [Models](Tutorials/ChatViewTutorial/ChatViewTutorial/Models/)
8 | - [Preview Content](Tutorials/ChatViewTutorial/ChatViewTutorial/Preview Content/)
9 | - [View](Tutorials/ChatViewTutorial/ChatViewTutorial/View/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/README.md:
--------------------------------------------------------------------------------
1 | ChatViewTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/ChatViewTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [ChatViewTutorial](Tutorials/ChatViewTutorial/ChatViewTutorial/)
4 | - [ChatViewTutorial.xcodeproj](Tutorials/ChatViewTutorial/ChatViewTutorial.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | FirebaseCloudStorageInSwiftUI.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | FirebaseCloudStorageInSwiftUI.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/AppIcon.appiconset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/README.md:
--------------------------------------------------------------------------------
1 | FirebaseCloudStorageInSwiftUI
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Assets.xcassets](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Assets.xcassets/)
4 | - [Base.lproj](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Base.lproj/)
5 | - [Preview Content](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/Preview Content/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/README.md:
--------------------------------------------------------------------------------
1 | FirebaseCloudStorageInSwiftUI
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/FirebaseCloudStorageInSwiftUI/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [FirebaseCloudStorageInSwiftUI](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI/)
4 | - [FirebaseCloudStorageInSwiftUI.xcodeproj](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcodeproj/)
5 | - [FirebaseCloudStorageInSwiftUI.xcworkspace](Tutorials/FirebaseCloudStorageInSwiftUI/FirebaseCloudStorageInSwiftUI.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | LoginScreenTutorial.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/AppIcon.appiconset/)
4 | - [iosapptemplate.imageset](Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/iosapptemplate.imageset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/iosapptemplate.imageset/README.md:
--------------------------------------------------------------------------------
1 | iosapptemplate.imageset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/iosapptemplate.imageset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/LoginScreenTutorial/LoginScreenTutorial/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/README.md:
--------------------------------------------------------------------------------
1 | LoginScreenTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/LoginScreenTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Assets.xcassets](Tutorials/LoginScreenTutorial/LoginScreenTutorial/Assets.xcassets/)
4 | - [Base.lproj](Tutorials/LoginScreenTutorial/LoginScreenTutorial/Base.lproj/)
5 | - [Preview Content](Tutorials/LoginScreenTutorial/LoginScreenTutorial/Preview Content/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/README.md:
--------------------------------------------------------------------------------
1 | LoginScreenTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/LoginScreenTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [LoginScreenTutorial](Tutorials/LoginScreenTutorial/LoginScreenTutorial/)
4 | - [LoginScreenTutorial.xcodeproj](Tutorials/LoginScreenTutorial/LoginScreenTutorial.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | MapViewTutorial.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/)
4 | - [xcshareddata](Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcschemes](Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/xcshareddata/xcschemes/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/xcshareddata/xcschemes/README.md:
--------------------------------------------------------------------------------
1 | xcschemes
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/xcshareddata/xcschemes/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/AppIcon.appiconset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/MapViewTutorial/MapViewTutorial/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/README.md:
--------------------------------------------------------------------------------
1 | MapViewTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/MapViewTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Assets.xcassets](Tutorials/MapViewTutorial/MapViewTutorial/Assets.xcassets/)
4 | - [Base.lproj](Tutorials/MapViewTutorial/MapViewTutorial/Base.lproj/)
5 | - [Preview Content](Tutorials/MapViewTutorial/MapViewTutorial/Preview Content/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/README.md:
--------------------------------------------------------------------------------
1 | MapViewTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/MapViewTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [MapViewTutorial](Tutorials/MapViewTutorial/MapViewTutorial/)
4 | - [MapViewTutorial.xcodeproj](Tutorials/MapViewTutorial/MapViewTutorial.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | NavigationDrawerTutorial.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/AppIcon.appiconset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/README.md:
--------------------------------------------------------------------------------
1 | NavigationDrawerTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Assets.xcassets](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Assets.xcassets/)
4 | - [Base.lproj](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Base.lproj/)
5 | - [Preview Content](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/Preview Content/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/README.md:
--------------------------------------------------------------------------------
1 | NavigationDrawerTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/NavigationDrawerTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [NavigationDrawerTutorial](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial/)
4 | - [NavigationDrawerTutorial.xcodeproj](Tutorials/NavigationDrawerTutorial/NavigationDrawerTutorial.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/README.md:
--------------------------------------------------------------------------------
1 | Tutorials
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/README.md:
--------------------------------------------------------------------------------
1 | SwiftUICombineMVVM
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | SwiftUICombineMVVM.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/AppIcon.appiconset/)
4 | - [beer.imageset](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/beer.imageset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/beer.imageset/README.md:
--------------------------------------------------------------------------------
1 | beer.imageset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/beer.imageset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/README.md:
--------------------------------------------------------------------------------
1 | SwiftUICombineMVVM
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Assets.xcassets](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Assets.xcassets/)
4 | - [Base.lproj](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Base.lproj/)
5 | - [Preview Content](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/Preview Content/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/SwiftUICombineMVVM/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [SwiftUICombineMVVM](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM/)
4 | - [SwiftUICombineMVVM.xcodeproj](Tutorials/SwiftUICombineMVVM/SwiftUICombineMVVM.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/README.md:
--------------------------------------------------------------------------------
1 | TabbedViewTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | TabbedViewTutorial.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/AppIcon.appiconset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/TabbedViewTutorial/TabbedViewTutorial/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/README.md:
--------------------------------------------------------------------------------
1 | TabbedViewTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/TabbedViewTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Assets.xcassets](Tutorials/TabbedViewTutorial/TabbedViewTutorial/Assets.xcassets/)
4 | - [Base.lproj](Tutorials/TabbedViewTutorial/TabbedViewTutorial/Base.lproj/)
5 | - [Preview Content](Tutorials/TabbedViewTutorial/TabbedViewTutorial/Preview Content/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TabbedViewTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [TabbedViewTutorial](Tutorials/TabbedViewTutorial/TabbedViewTutorial/)
4 | - [TabbedViewTutorial.xcodeproj](Tutorials/TabbedViewTutorial/TabbedViewTutorial.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/README.md:
--------------------------------------------------------------------------------
1 | TheHorizontalProgressBarTutorial
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/README.md:
--------------------------------------------------------------------------------
1 | TheHorizontalProgressBarView.xcodeproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [project.xcworkspace](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/README.md:
--------------------------------------------------------------------------------
1 | project.xcworkspace
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [xcshareddata](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/xcshareddata/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/xcshareddata/README.md:
--------------------------------------------------------------------------------
1 | xcshareddata
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/project.xcworkspace/xcshareddata/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/AppIcon.appiconset/README.md:
--------------------------------------------------------------------------------
1 | AppIcon.appiconset
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/AppIcon.appiconset/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [AppIcon.appiconset](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/AppIcon.appiconset/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Base.lproj/README.md:
--------------------------------------------------------------------------------
1 | Base.lproj
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Base.lproj/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Preview Content/Preview Assets.xcassets/README.md:
--------------------------------------------------------------------------------
1 | Preview Assets.xcassets
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Preview Content/Preview Assets.xcassets/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Preview Content/README.md:
--------------------------------------------------------------------------------
1 | Preview Content
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Preview Content/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Preview Assets.xcassets](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Preview Content/Preview Assets.xcassets/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/README.md:
--------------------------------------------------------------------------------
1 | TheHorizontalProgressBarView
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [Assets.xcassets](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Assets.xcassets/)
4 | - [Base.lproj](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Base.lproj/)
5 | - [Preview Content](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/Preview Content/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/TheHorizontalProgressBarTutorial/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [TheHorizontalProgressBarView](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView/)
4 | - [TheHorizontalProgressBarView.xcodeproj](Tutorials/TheHorizontalProgressBarTutorial/TheHorizontalProgressBarView.xcodeproj/)
--------------------------------------------------------------------------------
/devassistDocs/Tutorials/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [Home](/)
3 | - [CameraAndGalleryTutorial](Tutorials/CameraAndGalleryTutorial/)
4 | - [ChatViewTutorial](Tutorials/ChatViewTutorial/)
5 | - [FirebaseCloudStorageInSwiftUI](Tutorials/FirebaseCloudStorageInSwiftUI/)
6 | - [LoginScreenTutorial](Tutorials/LoginScreenTutorial/)
7 | - [MapViewTutorial](Tutorials/MapViewTutorial/)
8 | - [NavigationDrawerTutorial](Tutorials/NavigationDrawerTutorial/)
9 | - [SwiftUICombineMVVM](Tutorials/SwiftUICombineMVVM/)
10 | - [TabbedViewTutorial](Tutorials/TabbedViewTutorial/)
11 | - [TheHorizontalProgressBarTutorial](Tutorials/TheHorizontalProgressBarTutorial/)
--------------------------------------------------------------------------------