programing

Swift UI @ 바인딩 초기화

testmans 2023. 8. 13. 09:36
반응형

Swift UI @ 바인딩 초기화

스위프트를 가지고 놀고 있었습니다.UI를 사용하여 다음과 같은 개념을 이해했습니다.BindableObjects등 (적어도 그러길 바랍니다).

바보 같은 문제에 부딪혀서 답을 찾을 수 없는 것 같습니다.어떻게 초기화합니까?@Binding변수?

다음 코드가 있습니다.

struct LoggedInView : View {

    @Binding var dismissView: Bool

    var body: some View {
        VStack {
            Text("Hello World")
        }
    }
}

미리보기 코드에서 유형의 매개 변수를 전달하고 싶습니다.Binding<Bool>:

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: **Binding<Bool>**)
    }
}
#endif

초기화하려면 어떻게 해야 합니까? 시도:

Binding<Bool>.init(false)
Binding<Bool>(false)

또는 심지어:

@Binding var dismissView: Bool = false

하지만 아무 것도...무슨 생각이 있습니까?

사용할 때LoggedInView앱에서 다음과 같은 바인딩을 제공해야 합니다.@State이전의 관점이나 관점에서@EnvironmentObject.

특별한 경우에는PreviewProvider사용할 수 있는 고정된 값이 필요한 경우.constant(false)

예.

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: .constant(false))
    }
}
#endif

사용.Binding.constant(false)정적 미리 보기에만 사용할 수 있습니다.라이브 프리뷰를 시작하고 싶다면,constant실제 사례와 동일한 방식으로 동작하지 않습니다. 사용자의 작업에 의해 업데이트되지 않습니다.저는 개인적으로 라이브 미리보기를 많이 사용합니다. 고립된 뷰로 재생할 수 있기 때문입니다.

다음은 미리 보기를 위해 수행하는 작업입니다.Binding:

import SwiftUI

struct SomeView: View {
   @Binding var code: String

   var body: some View {
     // some views modifying code binding
   }
}

struct SomeView_Previews: PreviewProvider {
  static var previews: some View {
    PreviewWrapper()
  }

  struct PreviewWrapper: View {
    @State(initialValue: "") var code: String

    var body: some View {
      SomeView(code: $code)
    }
  }
}
  • 단일 뷰에 속하는 단순 속성이 필요한 경우 @State를 사용해야 합니다.
  • 여러 뷰(예: 2-3 뷰)에 속할 수 있는 복잡한 속성이 필요한 경우 @ObjectBinding을 사용해야 합니다.
  • 마지막으로 모든 주변 뷰를 사용해야 하는 속성이 필요한 경우 @EnvironmentObject를 사용해야 합니다.세부 정보 소스

이러한 경우에도 바인딩 변수를 초기화하려면 다음을 사용할 수 있습니다.

var binding: Binding = .constant(false)

미리 보기에서 사용해야 합니다..constant(Bool(false)):

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: .constant(Bool(false))
    }
}
#endif

viewModel과 같은 개체가 있으면 .constant()를 사용할 수도 있습니다.

struct View_Previews: PreviewProvider {
  static var previews: some View {
     View(vm:.constant(ViewModel(text: "Sample Text")))
  }
}

사용자 정의 컨트롤을 작업 중이며 사용자 정의 컨트롤의 다른 구성을 보고 싶습니다.@NeverwinterMoon에서 제공하는 구현을 확장하여 뷰의 독립적인 인스턴스를 여러 개 생성했습니다.

struct SomeView: View {
   @Binding var value: Int

   var body: some View {
     // some views modifying code binding
   }
}

struct SomeView_Previews: PreviewProvider {
  static var previews: some View {
    VStack {
      // The same view but with different configurations

      // Configuration #1
      PreviewWrapper() { value in
        SomeView(value: value)
          .background(Color.blue)
      }

      // Configuration #2      
      PreviewWrapper(initialValue: 2) { value in
        SomeView(value: value)
          .padding()
      }
    }
  }

  struct PreviewWrapper<Content: View>: View {
    @State var value: Int
    private let content: (Binding<Int>) -> Content
    
    init(
      initialValue: Int = 0,
      @ViewBuilder content: @escaping (Binding<Int>) -> Content
    ) {
      self.value = initialValue
      self.content = content
    }
    
    var body: some View {
      content($value)
    }
  }
}

언급URL : https://stackoverflow.com/questions/56685964/swiftui-binding-initialize

반응형