개발 창고/iOS

[SwiftUI] How to use views with "@Binding" in Preview

로이제로 2023. 12. 21. 22:00
반응형

How to use views with "@Binding" in Preview

SwiftUI를 @Binding을 사용하는 경우가 있고, 이때 미리 보기에서 아래와 같은 오류를 접하곤 합니다.

바인딩 오류 내용

Cannot convert value of type 'String' to expected argument type 'Binding<String>'

이는 Binding 변수인 value에 일반 문자열 값이 들어왔기 때문입니다.

 

다른 View에서 이 TestView를 이용할 경우에는 아래와 같이 @State를 이용하면 문제가 없지만,

struct UseView: View {
    @State private var input = "Binding 테스트입력입니다."
    
    var body: some View {
        TestView(value:$input)
    }
}

// View 미리보기
struct UseView_Previews: PreviewProvider {
    static var previews: some View {
        UseView()
    }
}

미리보기 화면

Prepview에서는 아래와 같이 사용하면 또 다른 오류를 발생시킵니다.

바인딩 오류 화면

Instance member '$input' cannot be used on type 'TestView_Previews'


해결방법

사족이 좀 길었는데, 이때 사용 가능한 게 .constant입니다. 이는 실제 View에서 사용하면 State의 변경을 감지하지 못하지만, Preview에서는 Binding처럼 사용 가능하게 됩니다.

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView(value:.constant("Binding 테스트입력입니다."))
    }
}

전체 테스트 소스

import SwiftUI

// View 페이지
struct TestView: View {
    @Binding var value:String
    
    var body: some View {
        Text(value)
    }
}

// 사용 View
struct UseView: View {
    @State private var input = "Binding 테스트입력입니다."
    
    var body: some View {
        TestView(value:$input)
    }
}

// View 미리보기
struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView(value:.constant("Binding 테스트입력입니다."))
    }
}

테스트 소스 결과

반응형