class SomeClass: ObservableObject {
}
struct SomeView: View {
@ObservedObject var property = SomeClass()
}
Observable Object
를 감시하다가 값이 바뀌면 뷰를 업데이트class SomeClass: ObservableObject {
@Published var property = Value()
}
ObservedObject
에서 사용//감시 가능 객체
//속성중 하나는 반드시 Published 사용해야 의미 있음
class ViewModel: ObservableObject {
@Published var title = "Hello"
//배열이 바뀔때마다 새로운 배열을 방출 -> ForEach나 List에 바인딩 시 항상 최신 항목 표시
@Published var list = [String]()
}
struct ObservableList: View {
@State private var value: String = ""
//ViewModel에 있던 @Published 변수의 값이 바뀔때마다 이 뷰가 갱신됨
@ObservedObject var viewModel = ViewModel()
var body: some View {
VStack {
Text(viewModel.title)
.font(.largeTitle)
Button {
//Published이기 때문에 바로 뷰에 적용됨
viewModel.title = "Hi"
} label: {
Text("Update Title")
}
.padding()
HStack {
TextField("Value", text: $value)
.textFieldStyle(.roundedBorder)
.padding()
Button {
viewModel.list.insert(value, at: 0)
value = ""
} label: {
Text("Add To List")
}
.padding()
}
List(viewModel.list, id: \.self) { item in
Text(item)
}
}
}
}
하나라도 빠지면 동작 X