16

I am currently working on SwiftUI app in which I am using SceneDelegate and AppDelegate. I would like to know how I can convert the life cycle from UIKit to SwiftUI one where there is an App struct and with scenes etc.

Also I would like to know how to cater for CoreData and PersistentContainers and inject these into our environments.

Also I have used UIApplicationDelegateAdapter to inject AppDelegate but the @main is giving me error

'main()' is only available in iOS 14.0 or newer

I am using @available (iOS 14.0, *) in the beginning:

import SwiftUI

@available(iOS 14.0, *)
@main

struct MyApp: App {

    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Doing it like this, where does the SceneDelegate code goes. I am still quite confused how this conversion goes. I have not seen Apple talking about this in their sessions or anything. Help will be really appreciated.

Alladinian
  • 34,483
  • 6
  • 89
  • 91
Osama Naeem
  • 1,830
  • 5
  • 16
  • 34
  • 1
    I think you have to set the deployment target to iOS 14, which be something you might not wanna do if you wanna release the app very soon. – Sajjon Jun 24 '20 at 20:18

2 Answers2

9

where does the SceneDelegate code goes.

@available(iOS 14.0, *)
@main
struct MyApp: App {

    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    @Environment(\.scenePhase) private var scenePhase

    var body: some Scene {
        WindowGroup {         // << this is a scene
          ContentView()
            .onChange(of: scenePhase) { phase in
              switch phase {
                case .active:
                    print(">> your code is here on scene become active")
                case .inactive:
                    print(">> your code is here on become inactive")
                case .background:
                    print(">> your code is here on go in background")
                default:
                    print(">> do something else in future")
             }
          }
        }
    }
}
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
Asperi
  • 228,894
  • 20
  • 464
  • 690
6

Set the environment on the ContentView as follows:

import SwiftUI
import CoreData

@main
struct MasterDetailApp: App {
  @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView().environment(\.managedObjectContext, appDelegate.persistentContainer.viewContext)
        }
    }
}
malhal
  • 26,330
  • 7
  • 115
  • 133