Mi az a state, state object és observed object az iOS fejlesztésben?
sobes.tech MI
Válasz az MI-től
A State egy SwiftUI-ben használt tulajdonságtok, amely lehetővé teszi a nézet helyi állapotának kezelését. Amikor a @State-tel becsomagolt tulajdonság értéke megváltozik, a nézet automatikusan frissül.
A StateObject egy SwiftUI tulajdonságbecsukás, amely az ObservableObject protokollt követő objektumok létrehozására és kezelésére szolgál, amelyek a nézet életciklusának részei. Hatékony olyan objektumok esetén, amelyeket a nézeten belül hozunk létre és együtt élnek vele.
Az ObservedObject egy SwiftUI tulajdonságbecsukás, amely meglévő ObservableObject típusú objektumokra való hivatkozások figyelésére szolgál, amelyeket kívülről adunk át. A SwiftUI figyeli ezekben az objektumokban bekövetkező változásokat, és frissíti a nézetet.
Összehasonlító táblázat:
| Becsomagolás | Cél | Tulajdonlás | Használati példa |
|---|---|---|---|
@State |
Helyi állapot a nézetben | Nézet | Egyszerű számláló, láthatósági jelző |
@StateObject |
ObservableObject létrehozása és tulajdonlás |
Nézet | Nézetmodell (ViewModel), amelyet a nézet hoz létre |
@ObservedObject |
Meglévő ObservableObject figyelése, amelyet |
Külső forrás | Nézetmodell (ViewModel), amit szülő nézettől kapunk |
A @State használatának példája:
struct CounterView: View {
@State private var count: Int = 0 // Helyi állapot
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1 // Az állapot változása frissítést vált ki
}
}
}
}
A @StateObject és @ObservedObject példái:
import SwiftUI
// ObservableObject a data modellhez
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Létrehozzuk és tulajdonoljuk a DataModel példányt
@StateObject private var localData = DataModel(value: "Kezdeti helyi érték")
var body: some View {
VStack {
Text("Helyi adatok: \(localData.value)")
Button("Helyi adatok módosítása") {
localData.value = "Módosított helyi érték \(Int.random(in: 1...100))"
}
// Átadjuk a localData-t a gyermek nézetnek
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Figyeljük a szülőtől kapott DataModel példányt
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Figyelt adatok a gyermekben: \(observedData.value)")
Button("Figyelt adatok módosítása") {
observedData.value = "Módosítva a gyermekből \(Int.random(in: 1...100))"
}
}
}
}