├── .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/) --------------------------------------------------------------------------------