From 9724d6e330595d88d04a40b15cb024217dd0956a Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Thu, 28 May 2026 14:27:15 +0200 Subject: [PATCH 1/2] Remove macOS target --- .gitignore | 32 +++ README.md | 5 + Recipes/Recipes.xcodeproj/project.pbxproj | 258 ------------------ .../UserInterfaceState.xcuserstate | Bin 96196 -> 0 bytes .../xcschemes/xcschememanagement.plist | 19 -- Recipes/Tests macOS/Info.plist | 22 -- Recipes/Tests macOS/Tests_macOS.swift | 42 --- Recipes/macOS/Info.plist | 26 -- Recipes/macOS/macOS.entitlements | 10 - 9 files changed, 37 insertions(+), 377 deletions(-) create mode 100644 .gitignore delete mode 100644 Recipes/Recipes.xcodeproj/project.xcworkspace/xcuserdata/pauljohanneskraft.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Recipes/Recipes.xcodeproj/xcuserdata/pauljohanneskraft.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Recipes/Tests macOS/Info.plist delete mode 100644 Recipes/Tests macOS/Tests_macOS.swift delete mode 100644 Recipes/macOS/Info.plist delete mode 100644 Recipes/macOS/macOS.entitlements diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..660e398 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# macOS +.DS_Store + +# Xcode — user-specific state +xcuserdata/ +*.xcuserstate +*.xcscmblueprint +*.xccheckout + +# Xcode — build output +DerivedData/ +build/ +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +# Swift Package Manager +.swiftpm/ +.build/ + +# CocoaPods (not used, prophylactic) +Pods/ + +# Carthage (not used, prophylactic) +Carthage/Build/ + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output diff --git a/README.md b/README.md index 33f9423..663afb3 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,11 @@ This example app is part of our blog article [How to Use the Coordinator Pattern in SwiftUI](https://quickbirdstudios.com/blog/coordinator-pattern-in-swiftui/). While the article introduces the different techniques and components of our approach to the Coordinator Pattern in SwiftUI on a general level, the Recipes App acts as a demonstration and can be used as a starting point to experimenting with it. In a follow-up article [Navigation and Deep-Links in SwiftUI](https://quickbirdstudios.com/blog/swiftui-navigation-deep-links/), we have further adapted the example app to use the [XUI library](https://github.com/quickbirdstudios/XUI). These adaptions can be found on the [xui branch](https://github.com/quickbirdstudios/SwiftUI-Coordinators-Example/tree/xui). + +## Requirements + +iOS 14+, Xcode 12+. Open `Recipes/Recipes.xcodeproj` and run the `Recipes (iOS)` scheme. + ## Recipes App The Recipes App lists different recipes with instructions on how to prepare it and ratings from previous users having tried it. In its current form, the app does not provide this functionality, but rather displays mock data. diff --git a/Recipes/Recipes.xcodeproj/project.pbxproj b/Recipes/Recipes.xcodeproj/project.pbxproj index 92c6612..ae44f20 100644 --- a/Recipes/Recipes.xcodeproj/project.pbxproj +++ b/Recipes/Recipes.xcodeproj/project.pbxproj @@ -8,51 +8,28 @@ /* Begin PBXBuildFile section */ 9B0BC35B25A34D9600C018D3 /* SafariView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B0BC35A25A34D9600C018D3 /* SafariView.swift */; }; - 9B0BC36525A394E100C018D3 /* AsyncImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B4FCF9225A2CFC5006BE60E /* AsyncImage.swift */; }; - 9B0BC36A25A394E400C018D3 /* SafariView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B0BC35A25A34D9600C018D3 /* SafariView.swift */; }; - 9B0BC36F25A394E600C018D3 /* RatingStars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8D00A9259FE1BE00684D22 /* RatingStars.swift */; }; - 9B0BC37425A3952700C018D3 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8D0097259FDFF100684D22 /* SettingsView.swift */; }; 9B4FCF9425A2CFC5006BE60E /* AsyncImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B4FCF9225A2CFC5006BE60E /* AsyncImage.swift */; }; 9B8D0098259FDFF100684D22 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8D0097259FDFF100684D22 /* SettingsView.swift */; }; 9B8D00AA259FE1BE00684D22 /* RatingStars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8D00A9259FE1BE00684D22 /* RatingStars.swift */; }; 9BB59DC925A4BDB600946BFB /* RecipeListCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DC825A4BDB600946BFB /* RecipeListCoordinatorView.swift */; }; - 9BB59DCA25A4BDB600946BFB /* RecipeListCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DC825A4BDB600946BFB /* RecipeListCoordinatorView.swift */; }; 9BB59DD425A4BDF100946BFB /* RecipeListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DD325A4BDF100946BFB /* RecipeListCoordinator.swift */; }; - 9BB59DD525A4BDF100946BFB /* RecipeListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DD325A4BDF100946BFB /* RecipeListCoordinator.swift */; }; 9BB59DF825A4C19500946BFB /* SheetModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DF725A4C19500946BFB /* SheetModifier.swift */; }; - 9BB59DF925A4C19500946BFB /* SheetModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DF725A4C19500946BFB /* SheetModifier.swift */; }; 9BB59DFF25A4C1A000946BFB /* PopoverModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DFE25A4C1A000946BFB /* PopoverModifier.swift */; }; - 9BB59E0025A4C1A000946BFB /* PopoverModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59DFE25A4C1A000946BFB /* PopoverModifier.swift */; }; 9BB59E0625A4C32200946BFB /* View+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59E0525A4C32200946BFB /* View+Navigation.swift */; }; - 9BB59E0725A4C32200946BFB /* View+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59E0525A4C32200946BFB /* View+Navigation.swift */; }; 9BB59E1E25A4C5BF00946BFB /* URL+Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59E1D25A4C5BF00946BFB /* URL+Identifiable.swift */; }; - 9BB59E1F25A4C5BF00946BFB /* URL+Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BB59E1D25A4C5BF00946BFB /* URL+Identifiable.swift */; }; 9BE362A62583CD1F00807BFC /* Tests_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362A52583CD1F00807BFC /* Tests_iOS.swift */; }; - 9BE362B12583CD1F00807BFC /* Tests_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362B02583CD1F00807BFC /* Tests_macOS.swift */; }; 9BE362B32583CD1F00807BFC /* RecipesApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE3628A2583CD1700807BFC /* RecipesApp.swift */; }; - 9BE362B42583CD1F00807BFC /* RecipesApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE3628A2583CD1700807BFC /* RecipesApp.swift */; }; 9BE362B72583CD1F00807BFC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9BE3628C2583CD1E00807BFC /* Assets.xcassets */; }; - 9BE362B82583CD1F00807BFC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9BE3628C2583CD1E00807BFC /* Assets.xcassets */; }; 9BE362CC2583CD3000807BFC /* Recipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362CB2583CD3000807BFC /* Recipe.swift */; }; - 9BE362CD2583CD3000807BFC /* Recipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362CB2583CD3000807BFC /* Recipe.swift */; }; 9BE362D32583CDB300807BFC /* HomeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362D22583CDB300807BFC /* HomeCoordinator.swift */; }; - 9BE362D42583CDB300807BFC /* HomeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362D22583CDB300807BFC /* HomeCoordinator.swift */; }; 9BE362DA2583CE0200807BFC /* RecipeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362D92583CE0200807BFC /* RecipeViewModel.swift */; }; - 9BE362DB2583CE0200807BFC /* RecipeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362D92583CE0200807BFC /* RecipeViewModel.swift */; }; 9BE362E12583CE2C00807BFC /* RatingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362E02583CE2C00807BFC /* RatingViewModel.swift */; }; - 9BE362E22583CE2C00807BFC /* RatingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362E02583CE2C00807BFC /* RatingViewModel.swift */; }; 9BE362E82583CE9400807BFC /* RecipeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362E72583CE9400807BFC /* RecipeService.swift */; }; - 9BE362E92583CE9400807BFC /* RecipeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE362E72583CE9400807BFC /* RecipeService.swift */; }; 9BE363042583CFC400807BFC /* HomeCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE363032583CFC400807BFC /* HomeCoordinatorView.swift */; }; - 9BE363052583CFC400807BFC /* HomeCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE363032583CFC400807BFC /* HomeCoordinatorView.swift */; }; 9BE3630B2583CFCF00807BFC /* RecipeList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE3630A2583CFCF00807BFC /* RecipeList.swift */; }; - 9BE3630C2583CFCF00807BFC /* RecipeList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE3630A2583CFCF00807BFC /* RecipeList.swift */; }; 9BE363212583D19600807BFC /* RecipeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE363202583D19600807BFC /* RecipeView.swift */; }; - 9BE363222583D19700807BFC /* RecipeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE363202583D19600807BFC /* RecipeView.swift */; }; 9BE363282583D1A200807BFC /* RatingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE363272583D1A200807BFC /* RatingView.swift */; }; - 9BE363292583D1A200807BFC /* RatingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE363272583D1A200807BFC /* RatingView.swift */; }; 9BE3633B25841BA200807BFC /* RecipeListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE3633A25841BA200807BFC /* RecipeListViewModel.swift */; }; - 9BE3633C25841BA200807BFC /* RecipeListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE3633A25841BA200807BFC /* RecipeListViewModel.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -63,13 +40,6 @@ remoteGlobalIDString = 9BE362902583CD1E00807BFC; remoteInfo = "Recipes (iOS)"; }; - 9BE362AD2583CD1F00807BFC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9BE362852583CD1600807BFC /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9BE362982583CD1E00807BFC; - remoteInfo = "Recipes (macOS)"; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -87,13 +57,11 @@ 9BE3628C2583CD1E00807BFC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9BE362912583CD1E00807BFC /* Recipes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Recipes.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9BE362942583CD1E00807BFC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9BE362992583CD1E00807BFC /* Recipes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Recipes.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9BE3629B2583CD1E00807BFC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9BE3629C2583CD1E00807BFC /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = ""; }; 9BE362A12583CD1F00807BFC /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 9BE362A52583CD1F00807BFC /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = ""; }; 9BE362A72583CD1F00807BFC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9BE362AC2583CD1F00807BFC /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 9BE362B02583CD1F00807BFC /* Tests_macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOS.swift; sourceTree = ""; }; 9BE362B22583CD1F00807BFC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9BE362CB2583CD3000807BFC /* Recipe.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Recipe.swift; sourceTree = ""; }; @@ -116,13 +84,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9BE362962583CD1E00807BFC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 9BE3629E2583CD1F00807BFC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -130,13 +91,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9BE362A92583CD1F00807BFC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -224,9 +178,7 @@ isa = PBXGroup; children = ( 9BE362912583CD1E00807BFC /* Recipes.app */, - 9BE362992583CD1E00807BFC /* Recipes.app */, 9BE362A12583CD1F00807BFC /* Tests iOS.xctest */, - 9BE362AC2583CD1F00807BFC /* Tests macOS.xctest */, ); name = Products; sourceTree = ""; @@ -335,23 +287,6 @@ productReference = 9BE362912583CD1E00807BFC /* Recipes.app */; productType = "com.apple.product-type.application"; }; - 9BE362982583CD1E00807BFC /* Recipes (macOS) */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9BE362BE2583CD1F00807BFC /* Build configuration list for PBXNativeTarget "Recipes (macOS)" */; - buildPhases = ( - 9BE362952583CD1E00807BFC /* Sources */, - 9BE362962583CD1E00807BFC /* Frameworks */, - 9BE362972583CD1E00807BFC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Recipes (macOS)"; - productName = "Recipes (macOS)"; - productReference = 9BE362992583CD1E00807BFC /* Recipes.app */; - productType = "com.apple.product-type.application"; - }; 9BE362A02583CD1F00807BFC /* Tests iOS */ = { isa = PBXNativeTarget; buildConfigurationList = 9BE362C12583CD1F00807BFC /* Build configuration list for PBXNativeTarget "Tests iOS" */; @@ -370,24 +305,6 @@ productReference = 9BE362A12583CD1F00807BFC /* Tests iOS.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; - 9BE362AB2583CD1F00807BFC /* Tests macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9BE362C42583CD1F00807BFC /* Build configuration list for PBXNativeTarget "Tests macOS" */; - buildPhases = ( - 9BE362A82583CD1F00807BFC /* Sources */, - 9BE362A92583CD1F00807BFC /* Frameworks */, - 9BE362AA2583CD1F00807BFC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 9BE362AE2583CD1F00807BFC /* PBXTargetDependency */, - ); - name = "Tests macOS"; - productName = "Tests macOS"; - productReference = 9BE362AC2583CD1F00807BFC /* Tests macOS.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -400,17 +317,10 @@ 9BE362902583CD1E00807BFC = { CreatedOnToolsVersion = 12.2; }; - 9BE362982583CD1E00807BFC = { - CreatedOnToolsVersion = 12.2; - }; 9BE362A02583CD1F00807BFC = { CreatedOnToolsVersion = 12.2; TestTargetID = 9BE362902583CD1E00807BFC; }; - 9BE362AB2583CD1F00807BFC = { - CreatedOnToolsVersion = 12.2; - TestTargetID = 9BE362982583CD1E00807BFC; - }; }; }; buildConfigurationList = 9BE362882583CD1600807BFC /* Build configuration list for PBXProject "Recipes" */; @@ -427,9 +337,7 @@ projectRoot = ""; targets = ( 9BE362902583CD1E00807BFC /* Recipes (iOS) */, - 9BE362982583CD1E00807BFC /* Recipes (macOS) */, 9BE362A02583CD1F00807BFC /* Tests iOS */, - 9BE362AB2583CD1F00807BFC /* Tests macOS */, ); }; /* End PBXProject section */ @@ -443,14 +351,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9BE362972583CD1E00807BFC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9BE362B82583CD1F00807BFC /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 9BE3629F2583CD1F00807BFC /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -458,13 +358,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9BE362AA2583CD1F00807BFC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -496,34 +389,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9BE362952583CD1E00807BFC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9BE3633C25841BA200807BFC /* RecipeListViewModel.swift in Sources */, - 9BB59E1F25A4C5BF00946BFB /* URL+Identifiable.swift in Sources */, - 9BE363222583D19700807BFC /* RecipeView.swift in Sources */, - 9BE362CD2583CD3000807BFC /* Recipe.swift in Sources */, - 9BE362E92583CE9400807BFC /* RecipeService.swift in Sources */, - 9BE363292583D1A200807BFC /* RatingView.swift in Sources */, - 9BE362B42583CD1F00807BFC /* RecipesApp.swift in Sources */, - 9BB59E0025A4C1A000946BFB /* PopoverModifier.swift in Sources */, - 9B0BC36A25A394E400C018D3 /* SafariView.swift in Sources */, - 9BB59E0725A4C32200946BFB /* View+Navigation.swift in Sources */, - 9BE362E22583CE2C00807BFC /* RatingViewModel.swift in Sources */, - 9B0BC37425A3952700C018D3 /* SettingsView.swift in Sources */, - 9BB59DCA25A4BDB600946BFB /* RecipeListCoordinatorView.swift in Sources */, - 9BE362DB2583CE0200807BFC /* RecipeViewModel.swift in Sources */, - 9BB59DD525A4BDF100946BFB /* RecipeListCoordinator.swift in Sources */, - 9BE363052583CFC400807BFC /* HomeCoordinatorView.swift in Sources */, - 9BE362D42583CDB300807BFC /* HomeCoordinator.swift in Sources */, - 9BB59DF925A4C19500946BFB /* SheetModifier.swift in Sources */, - 9B0BC36525A394E100C018D3 /* AsyncImage.swift in Sources */, - 9B0BC36F25A394E600C018D3 /* RatingStars.swift in Sources */, - 9BE3630C2583CFCF00807BFC /* RecipeList.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 9BE3629D2583CD1F00807BFC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -532,14 +397,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9BE362A82583CD1F00807BFC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9BE362B12583CD1F00807BFC /* Tests_macOS.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -548,11 +405,6 @@ target = 9BE362902583CD1E00807BFC /* Recipes (iOS) */; targetProxy = 9BE362A22583CD1F00807BFC /* PBXContainerItemProxy */; }; - 9BE362AE2583CD1F00807BFC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9BE362982583CD1E00807BFC /* Recipes (macOS) */; - targetProxy = 9BE362AD2583CD1F00807BFC /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -712,54 +564,6 @@ }; name = Release; }; - 9BE362BF2583CD1F00807BFC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 77E79NGPCV; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = macOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - PRODUCT_BUNDLE_IDENTIFIER = com.quickbirdstudios.Recipes; - PRODUCT_NAME = Recipes; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 9BE362C02583CD1F00807BFC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 77E79NGPCV; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = macOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - PRODUCT_BUNDLE_IDENTIFIER = com.quickbirdstudios.Recipes; - PRODUCT_NAME = Recipes; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; 9BE362C22583CD1F00807BFC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -805,50 +609,6 @@ }; name = Release; }; - 9BE362C52583CD1F00807BFC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 77E79NGPCV; - INFOPLIST_FILE = "Tests macOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.quickbirdstudios.Tests-macOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = "Recipes (macOS)"; - }; - name = Debug; - }; - 9BE362C62583CD1F00807BFC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 77E79NGPCV; - INFOPLIST_FILE = "Tests macOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.quickbirdstudios.Tests-macOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = "Recipes (macOS)"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -870,15 +630,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9BE362BE2583CD1F00807BFC /* Build configuration list for PBXNativeTarget "Recipes (macOS)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9BE362BF2583CD1F00807BFC /* Debug */, - 9BE362C02583CD1F00807BFC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 9BE362C12583CD1F00807BFC /* Build configuration list for PBXNativeTarget "Tests iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -888,15 +639,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9BE362C42583CD1F00807BFC /* Build configuration list for PBXNativeTarget "Tests macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9BE362C52583CD1F00807BFC /* Debug */, - 9BE362C62583CD1F00807BFC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 9BE362852583CD1600807BFC /* Project object */; diff --git a/Recipes/Recipes.xcodeproj/project.xcworkspace/xcuserdata/pauljohanneskraft.xcuserdatad/UserInterfaceState.xcuserstate b/Recipes/Recipes.xcodeproj/project.xcworkspace/xcuserdata/pauljohanneskraft.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 85da9ec1701ba18cd88df31169583a1ae5dc7426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96196 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 AX8-^I diff --git a/Recipes/Recipes.xcodeproj/xcuserdata/pauljohanneskraft.xcuserdatad/xcschemes/xcschememanagement.plist b/Recipes/Recipes.xcodeproj/xcuserdata/pauljohanneskraft.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 3dd0406..0000000 --- a/Recipes/Recipes.xcodeproj/xcuserdata/pauljohanneskraft.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - SchemeUserState - - Recipes (iOS).xcscheme_^#shared#^_ - - orderHint - 1 - - Recipes (macOS).xcscheme_^#shared#^_ - - orderHint - 0 - - - - diff --git a/Recipes/Tests macOS/Info.plist b/Recipes/Tests macOS/Info.plist deleted file mode 100644 index 64d65ca..0000000 --- a/Recipes/Tests macOS/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/Recipes/Tests macOS/Tests_macOS.swift b/Recipes/Tests macOS/Tests_macOS.swift deleted file mode 100644 index 5de9402..0000000 --- a/Recipes/Tests macOS/Tests_macOS.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// Tests_macOS.swift -// Tests macOS -// -// Created by Paul Kraft on 11.12.20. -// - -import XCTest - -class Tests_macOS: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // UI tests must launch the application that they test. - let app = XCUIApplication() - app.launch() - - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testLaunchPerformance() throws { - if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { - // This measures how long it takes to launch your application. - measure(metrics: [XCTApplicationLaunchMetric()]) { - XCUIApplication().launch() - } - } - } -} diff --git a/Recipes/macOS/Info.plist b/Recipes/macOS/Info.plist deleted file mode 100644 index bacbc56..0000000 --- a/Recipes/macOS/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - - diff --git a/Recipes/macOS/macOS.entitlements b/Recipes/macOS/macOS.entitlements deleted file mode 100644 index f2ef3ae..0000000 --- a/Recipes/macOS/macOS.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - - - From b8844fd1d866a3e2331a82a51629c67a5422aad8 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Thu, 28 May 2026 14:33:16 +0200 Subject: [PATCH 2/2] modernize --- Recipes/Shared/Extensions/URL+Identifiable.swift | 2 +- Recipes/Shared/Scenes/Home/HomeCoordinator.swift | 2 +- .../Shared/Scenes/Home/HomeCoordinatorView.swift | 2 +- .../Scenes/RecipeList/RecipeListViewModel.swift | 6 ------ Recipes/Shared/Scenes/Settings/SettingsView.swift | 2 +- Recipes/Shared/ViewModifiers/PopoverModifier.swift | 3 +++ Recipes/Shared/ViewModifiers/SheetModifier.swift | 5 +++++ Recipes/Shared/ViewModifiers/View+Navigation.swift | 13 +++++++++++++ 8 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Recipes/Shared/Extensions/URL+Identifiable.swift b/Recipes/Shared/Extensions/URL+Identifiable.swift index 456c829..ba9148b 100644 --- a/Recipes/Shared/Extensions/URL+Identifiable.swift +++ b/Recipes/Shared/Extensions/URL+Identifiable.swift @@ -7,7 +7,7 @@ import Foundation -extension URL: Identifiable { +extension URL: @retroactive Identifiable { public var id: String { absoluteString diff --git a/Recipes/Shared/Scenes/Home/HomeCoordinator.swift b/Recipes/Shared/Scenes/Home/HomeCoordinator.swift index f43603c..2848b09 100644 --- a/Recipes/Shared/Scenes/Home/HomeCoordinator.swift +++ b/Recipes/Shared/Scenes/Home/HomeCoordinator.swift @@ -1,5 +1,5 @@ // -// HomeViewModel.swift +// HomeCoordinator.swift // Recipes // // Created by Paul Kraft on 11.12.20. diff --git a/Recipes/Shared/Scenes/Home/HomeCoordinatorView.swift b/Recipes/Shared/Scenes/Home/HomeCoordinatorView.swift index 187857b..c163fea 100644 --- a/Recipes/Shared/Scenes/Home/HomeCoordinatorView.swift +++ b/Recipes/Shared/Scenes/Home/HomeCoordinatorView.swift @@ -1,5 +1,5 @@ // -// HomeCoordinator.swift +// HomeCoordinatorView.swift // Recipes // // Created by Paul Kraft on 11.12.20. diff --git a/Recipes/Shared/Scenes/RecipeList/RecipeListViewModel.swift b/Recipes/Shared/Scenes/RecipeList/RecipeListViewModel.swift index 2316cd3..f849042 100644 --- a/Recipes/Shared/Scenes/RecipeList/RecipeListViewModel.swift +++ b/Recipes/Shared/Scenes/RecipeList/RecipeListViewModel.swift @@ -7,12 +7,6 @@ import SwiftUI -extension Identifiable where ID: Hashable { - func hash(into hasher: inout Hasher) { - hasher.combine(id) - } -} - class RecipeListViewModel: ObservableObject { // MARK: Stored Properties diff --git a/Recipes/Shared/Scenes/Settings/SettingsView.swift b/Recipes/Shared/Scenes/Settings/SettingsView.swift index cb2d87a..73e3b6a 100644 --- a/Recipes/Shared/Scenes/Settings/SettingsView.swift +++ b/Recipes/Shared/Scenes/Settings/SettingsView.swift @@ -21,7 +21,7 @@ struct SettingsView: View { Text("Nymphenburger Str. 13-15") Text("80335 Munich") } - .frame(maxWidth: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/, maxHeight: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/) + .frame(maxWidth: .infinity, maxHeight: .infinity) .contentShape(Rectangle()) .onTapGesture(perform: openWebsite) .navigationTitle("Settings") diff --git a/Recipes/Shared/ViewModifiers/PopoverModifier.swift b/Recipes/Shared/ViewModifiers/PopoverModifier.swift index e2b9588..c178657 100644 --- a/Recipes/Shared/ViewModifiers/PopoverModifier.swift +++ b/Recipes/Shared/ViewModifiers/PopoverModifier.swift @@ -7,6 +7,9 @@ import SwiftUI +/// Presents `content(item)` as a popover whenever `item` is non-nil. +/// Pair with `SheetModifier` to let a coordinator pick the presentation +/// style for a leaf view based on device or size class. struct PopoverModifier: ViewModifier { // MARK: Stored Properties diff --git a/Recipes/Shared/ViewModifiers/SheetModifier.swift b/Recipes/Shared/ViewModifiers/SheetModifier.swift index 9c9d348..e8eb4d5 100644 --- a/Recipes/Shared/ViewModifiers/SheetModifier.swift +++ b/Recipes/Shared/ViewModifiers/SheetModifier.swift @@ -7,6 +7,11 @@ import SwiftUI +/// Presents `content(item)` as a sheet whenever `item` is non-nil. +/// +/// Exists as a `ViewModifier` so a coordinator can inject either this or +/// `PopoverModifier` into a leaf view, switching the presentation style +/// (e.g. by device or size class) without the leaf knowing about it. struct SheetModifier: ViewModifier { // MARK: Stored Properties diff --git a/Recipes/Shared/ViewModifiers/View+Navigation.swift b/Recipes/Shared/ViewModifiers/View+Navigation.swift index 872e501..c2b3bec 100644 --- a/Recipes/Shared/ViewModifiers/View+Navigation.swift +++ b/Recipes/Shared/ViewModifiers/View+Navigation.swift @@ -9,6 +9,9 @@ import SwiftUI extension View { + /// Wraps `self` in a hidden `NavigationLink` whose activation fires `action`. + /// Use when the tap should trigger an imperative side effect (typically a + /// coordinator method) rather than navigate to a statically known destination. func onNavigation(_ action: @escaping () -> Void) -> some View { let isActive = Binding( get: { false }, @@ -26,6 +29,10 @@ extension View { } } + /// Pushes `destination(item)` whenever `item` becomes non-nil; clearing + /// `item` (e.g. when the user pops) is propagated back through the binding. + /// Lets a coordinator drive navigation by mutating an optional `@Published` + /// view model rather than embedding a hardcoded `NavigationLink` in the view. func navigation( item: Binding, @ViewBuilder destination: (Item) -> Destination @@ -43,6 +50,9 @@ extension View { } } + /// Pushes `destination()` while `isActive` is true. The destination is + /// constructed lazily — only when the link is active — and the link itself + /// lives in an `overlay` so it doesn't disturb the receiver's layout. func navigation( isActive: Binding, @ViewBuilder destination: () -> Destination @@ -60,6 +70,9 @@ extension View { extension NavigationLink { + /// Optional-item-driven `NavigationLink`: active iff `item` is non-nil, + /// and pops by clearing the binding. Mirrors `sheet(item:content:)` + /// for push-style navigation. init(item: Binding, @ViewBuilder destination: (T) -> D, @ViewBuilder label: () -> Label) where Destination == D? {