Cannot render SwiftUI preview from a custom framework

Hello, I am trying to code a SwiftUI view in a custom framework.

The reason to do this is that I want to hide sub-views' implementation, since Swift does not provide a namespace. So, I made a sub-framework and Implemented a test view inside of that.

But, inside the Framework(named Calendar), If I write these code, then I cannot see the preview. Of course I can preview outside of the Framework, for example, when I import & use this in some single-view app.

import SwiftUI

public struct Cell: View {
    public init() {}
    
    public var body: some View {
        Text("CELL for SingleView")
    }
}

struct Cell_Previews: PreviewProvider {
    init() {}
    
    static var previews: some View {
        Cell()
    }
}

Everything works good, but there is an error from the preview pane:

Compiling failed: 'Cell_Previews' is not a member type of 'Calendar'

I tried to wrap the struct with #if DEBUG then:

import SwiftUI

public struct Cell: View {
    public init() {}
    
    public var body: some View {
        Text("CELL for SingleView")
    }
}

#if DEBUG
struct Cell_Previews: PreviewProvider {
    init() {}
    
    static var previews: some View {
        Cell()
    }
}
#endif

The error is changed! into:

Compiling failed: 'Cell' is not a member type of 'Calendar'

So I wrapped both of structs:

import SwiftUI

#if DEBUG
public struct Cell: View {
    public init() {}
    
    public var body: some View {
        Text("CELL for SingleView")
    }
}

struct Cell_Previews: PreviewProvider {
    init() {}
    
    static var previews: some View {
        Cell()
    }
}
#endif

The preview worked like a magic! But obviously, it is a crazy idea since it does not work in release mode.

I suspect that this is a bug. What should I do?

It should work. It works for me at least.

Have you checked if the file is added to the correct target?

I think. Actually I asked this question into stackoverflow first, but there is an other person with this problem also: https://stackoverflow.com/questions/59137401/cannot-render-swiftui-preview-from-a-custom-framework
And this is the repo for the reproduction of this error: https://github.com/inq/singleview
In here, ContentView.swift(the user of the framework) renders preview correctly, whereas Cell.swift(the implementation of the view) does not

I've got some more hint. When I open the intermediate file(Cell.3.preview-thunk), then:

@_private(sourceFile: "Cell.swift") import Calendar
import SwiftUI
import SwiftUI

extension Cell_Previews {
    @_dynamicReplacement(for: previews) private static var __preview__previews: some View {
        #sourceLocation(file: "/Users/q/Projects/Calendar/Calendar/Cell.swift", line: 19)
        AnyView(__designTimeSelection(Cell(), "#9226.[2].[0].property.[0].[0]"))
#sourceLocation()
    }
}

extension Cell {
    @_dynamicReplacement(for: body) private var __preview__body: some View {
        #sourceLocation(file: "/Users/q/Projects/Calendar/Calendar/Cell.swift", line: 13)
        AnyView(__designTimeSelection(Text(/*@START_MENU_TOKEN@*/__designTimeString("#9226.[1].[0].property.[0].[0].arg[0].value.[0].value", fallback: "Hello, World!")/*@END_MENU_TOKEN@*/), "#9226.[1].[0].property.[0].[0]"))
#sourceLocation()
    }
}

typealias Cell = Calendar.Cell
typealias Cell_Previews = Calendar.Cell_Previews

There is two typealiases in the end of the file. But If I put #if DEBUG flag, then they disappear. I think those two lines should be the cause and it is useless. What is these?

Terms of Service

Privacy Policy

Cookie Policy