Darrell Root
Darrell Root

Reputation: 844

SwiftUI: How to change top-level ContentView @State during preview?

I have a top-level MacOS SwiftUI content view where I normally initialize @State for my array of [Frame] to an empty array []. But when I preview it, I would like to have a sample Frame in it.

Here's minimal code: (Frame is my own struct, Frame.sampleFrame is a static frame for preview use).

struct ContentView: View {
    @State var frames: [Frame] = []

    var body: some View {
        VStack {
            FrameSummaryView(frames: self.$frames)
            Text("Placeholder")
        }.frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

and here's how I create a constant 1-element array [Frame.sampleFrame] in my FrameSummaryView, if I preview that:

struct FrameSummaryView_Previews: PreviewProvider {
    static var previews: some View {
        FrameSummaryView(frames: .constant([Frame.sampleFrame]))
    }
}

How can I make it so my top level ContentView uses the .constant([Frame.sampleFrame]) [Frame] array when in preview mode?

Upvotes: 2

Views: 629

Answers (1)

Asperi
Asperi

Reputation: 257493

Here is possible approach

struct ContentView: View {
    @State var frames: [Frame]

    init(_ frames: [Frame] = []) {
        _frames = State<[Frame]>(initialValue: frames)
    }

    var body: some View {
        VStack {
            FrameSummaryView(frames: self.$frames)
            Text("Placeholder")
        }.frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView([Frame.sampleFrame])
    }
}

Upvotes: 1

Related Questions