🌊

@Bindingの変数を持ったViewのPreviewの実装(SwiftUI)

2023/12/24に公開

追記(2024-09-02)

前提

  • 前提として、ボタンをクリックすると画像をPopoverを表示するようなボタンがあるとします。
import SwiftUI

struct PreviewButton: View {
    
    @Binding var popover: Bool
    let image: Image
        
    var body: some View {
        Button {
            popover = true
        } label: {
            Image(systemName: "questionmark.circle")
                .font(.system(size: 14))
        }
        .foregroundStyle(.secondary)
        .buttonStyle(.plain)
        .popover(isPresented: $popover) {
            image
                .resizable()
                .scaledToFit()
                .frame(width: 200)
        }
    }
}

image

image

#Preview {
    
    @State var popover = false
    
    return HStack {
        Text("Offset when Arranged to Edge")
        PreviewButton(popover: $popover, image: Image(.Preview.edgeOffset))
    }
    .frame(width: 300, height: 300)
    .padding()
}

解決策

  • 下記のようにもう一つPreview用のViewを入れ子で作成するとうまくいきます。
#Preview {
    struct PreviewView: View {
        
        @State private var popover = false
        
        var body: some View {
            HStack {
                Text("Offset when Arranged to Edge")
                PreviewButton(popover: $popover, image: Image(.Preview.edgeOffset))
            }
            .frame(width: 300, height: 300)
            .padding()
        }
    }
    
    return PreviewView()
}

Discussion