Middle
Kas yra state, state object ir observed object iOS kūrime?
sobes.tech AI
Atsakymas iš AI
State — tai SwiftUI savybė, leidžianti valdyti vietinę vaizdo būseną. Kai keičiasi @State apimtos savybės reikšmė, vaizdas automatiškai atnaujinamas.
StateObject — tai SwiftUI savybė, skirta kurti ir valdyti ObservableObject protokolą atitinkančius objektus, kurie yra vaizdo gyvavimo ciklo dalis. Efektyvu tiems objektams, kurie kuriami viduje vaizdo ir su juo gyvena.
ObservedObject — tai SwiftUI savybė, skirta stebėti esamus ObservableObject objektus, kurie buvo perduoti iš išorės. SwiftUI stebi šiuose objektuose vykstančius pokyčius ir atnaujina vaizdą.
Lyginamoji lentelė:
| Apvyniojimas | Paskirtis | Nuosavybė | Pavyzdys naudojimo |
|---|---|---|---|
@State |
Vietinis vaizdo būsenos valdymas | Vaizdas | Paprastas skaitiklis, matomumo žymeklis |
@StateObject |
ObservableObject kūrimas ir nuosavybė |
Vaizdas | Vaizdo modelis (ViewModel), sukurtas vaizde |
@ObservedObject |
Stebėti ObservableObject, perduotą iš išorės |
Išorinis šaltinis | Vaizdo modelis (ViewModel), perduotas iš tėvo vaizdo |
@State naudojimo pavyzdys:
struct CounterView: View {
@State private var count: Int = 0 // Vietinis būsenos
var body: some View {
VStack {
Text("Skaitiklis: \(count)")
Button("Padidinti") {
count += 1 // Būsenos pakeitimas sukelia atnaujinimą
}
}
}
}
@StateObject ir @ObservedObject pavyzdžiai:
import SwiftUI
// `ObservableObject` duomenų modeliui
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Sukuriame ir valdome DataModel egzempliorių
@StateObject private var localData = DataModel(value: "Pradinis vietinis vertė")
var body: some View {
VStack {
Text("Vietiniai duomenys: \(localData.value)")
Button("Keisti vietinius duomenis") {
localData.value = "Pakeista vietinė vertė \(Int.random(in: 1...100))"
}
// perduodame localData vaikų vaizdui
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Sekame perduotą DataModel egzempliorių
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Stebimi duomenys vaikui: \(observedData.value)")
Button("Keisti stebimus duomenis") {
observedData.value = "Pakeista iš vaiko \(Int.random(in: 1...100))"
}
}
}
}