SwiftUI 이니셜 라이저에서 View에 @Binding이 필요한 경우 PreviewProvider를 인스턴스화하는 방법


10

SwiftUI (Xcode 11.1)를 사용하면 양방향 바인딩 ( @Binding 사용 ) 으로 일부 뷰를 설정했습니다 . 양방향 업데이트가 훌륭합니다.

그러나 PreviewProvider에서보기를 어떻게 인스턴스화 할 수 있습니까?

예를 들면 다음과 같습니다.

struct AddProjectView: View {

    @Binding public var showModal: Bool

    var body: some View {

        return VStack {
            Text("Add Project View")
            Button("Dismiss") {
                self.showModal = false
            }
        }
    }
}

"true"는 바인딩이 아니기 때문에이 작업을 수행 할 수 없습니다.

struct AddProjectView_Previews: PreviewProvider {
    static var previews: some View {
        AddProjectView(showModal: true)
    }
}

" 속성 래퍼는 아직 로컬 속성에서 지원되지 않기 때문에"이 작업을 수행 할 수 없습니다 .

struct AddProjectView_Previews: PreviewProvider {
    static var previews: some View {
        @Binding var show = true
        return AddProjectView(showModal: $show)
    }
}

우리는 이것을 어떻게합니까?

감사!!

답변:


15

.constant 바로 그 의미입니다.

/// 불변의 바인딩을 작성합니다 value.

struct AddProjectView: View {
    @Binding public var showModal: Bool
    var body: some View {
        return VStack {
            Text("Add Project View")
            Button("Dismiss") {
                self.showModal = false
            }
        }
    }
}

struct AddProjectView_Previews: PreviewProvider {
    static var previews: some View {
        AddProjectView(showModal: .constant(true))
    }
}

완전한! -- 대박!
drewster

5

미리보기에서 @State로 선언해야합니다.

struct AddProjectView_Previews: PreviewProvider {

     @State static var showModal: Bool = false

     static var previews: some View {
         AddProjectView(showModal: $showModal)
     }
}

또한 정적 기능에 사용될 때 정적이어야 함을 기억하십시오.


1
XCode 11.3의 동작은을 사용하는 것과 사실상 동일합니다 .constant(false). 즉, 라이브 미리보기를 사용하는 경우 값을 변경할 수 없습니다.
Fabian Streitel

4

상수 값만 필요한 경우 다음을 사용하십시오 .constant(VALUE).

struct YourView_Previews: PreviewProvider {

    static var previews: some View {
        YourView(yourBindingVar: .constant(true))
    }

}

라이브 미리보기에서 변경할 수있는 값이 필요한 경우이 도우미 클래스를 사용하고 싶습니다.

struct BindingProvider<StateT, Content: View>: View {

    @State private var state: StateT
    private var content: (_ binding: Binding<StateT>) -> Content

    init(_ initialState: StateT, @ViewBuilder content: @escaping (_ binding: Binding<StateT>) -> Content) {
        self.content = content
        self._state = State(initialValue: initialState)
    }

    var body: some View {
        self.content($state)
    }
}

다음과 같이 사용하십시오.

struct YourView_Previews: PreviewProvider {

    static var previews: some View {
        BindingProvider(false) { binding in
            YourView(yourBindingVar: binding)
        }
    }

}

이를 통해 라이브 미리보기에서 바인딩 변경을 테스트 할 수 있습니다.


당신은 당신의 대답이 어떻게 더 나은 코드를 만드는 데 도움이되었는지 전혀 모른다. 정말 고마워. 나는 아직도 SWIFTUI와 BindingProvider를 배우고 있습니다. 제한된 신속한 지식을 뛰어 넘습니다. 나는 이해하지만 100 %를 이해하지 못한다. 어쨌든 고마워.
GrandSteph

기쁘다! 계속 유지하고 배우십시오 : D
Fabian Streitel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.