Bryan Potts
Bryan Potts

Reputation: 921

Open a .sheet() from an outside class in SwiftUI

I have tried a few variations of using ObservableObject and @Published to try to open a sheet in my ContentView from an update via an outside class, but I can't get it to work.

How can I achieve this with an Observable/Observed object?

import SwiftUI

class SheetObservable: ObservableObject {
    @Published var isActive = false
}

struct ContentView: View {
    @ObservedObject var Sheet = SheetObservable()
    var body: some View {
        Button(action:{
            Actions().openSheet()
        }){
            Text("Open Sheet")
        }
        .sheet(isPresented: self.$Sheet.isActive) {
            EmptyView()
        }
    }
}

class Actions {
    @ObservedObject var Sheet = SheetObservable()
    public func openSheet() {
        print("openSheet fired()")
        self.Sheet.isActive = true
    }
}

Upvotes: 2

Views: 644

Answers (1)

Asperi
Asperi

Reputation: 257663

It needs to use same instance of ObjservableObject, so here is fixed code

struct ContentView: View {
    @ObservedObject var Sheet = SheetObservable()
    var body: some View {
        Button(action:{
            Actions(sheet: self.Sheet).openSheet()
        }){
            Text("Open Sheet")
        }
        .sheet(isPresented: self.$Sheet.isActive) {
            EmptyView()
        }
    }
}

class Actions {
    @ObservedObject var Sheet: SheetObservable

    init(sheet: SheetObservable) {
        self.Sheet = sheet
    }

    public func openSheet() {
        print("openSheet fired()")
        self.Sheet.isActive = true
    }
}

Tested with Xcode 11.4 / iOS 13.4

Upvotes: 1

Related Questions