SwiftUI, iOS: How to access public function inside @main struct from custom internal View?

Viewed 322

How to access achieveTo() inside @main struct from CustomInternalView()?

@main
struct MyApp: App {
    
    var body: some Scene {
        WindowGroup {
            CustomInternalView()
        }
    }

    public func achieveTo() {
        // Do stuff
    }
}


struct CustomInternalView: View {
    var body: some View {
         Text("Some")
    }
    .onDisappear {
        // How to call "achieveTo" from here????????????
    }
}

In UIKit it is like UIApplication.shared.windows.first!.rootViewController as! YourViewController, How about SwiftUI?

2 Answers

You can add a closure:

@main
struct MyApp: App {
    
    var body: some Scene {
        WindowGroup {
            CustomInternalView {
                achieveTo() /// 2. Assign closure
            }
        }
    }

    public func achieveTo() {
        // Do stuff
    }
}
struct CustomInternalView: View {
    var callParentTask: (() -> Void) /// 1. Define closure
    
    var body: some View {
         Text("Some")
            .onDisappear(perform: callParentTask) /// 3. Call closure
    }
}

Note: Your onDisappear must be attached to a View inside the var body: some View {, not outside.

Another simpler version of what @aheze answered:

import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        
        WindowGroup {
            
            CustomInternalView()
                .onDisappear() { achieveTo() }

        }
    }
}

func achieveTo() {
    // Do stuff
}

struct CustomInternalView: View {

    var body: some View {
         Text("Some")
    }

}
Related