- Published on
Foydalanuvchi sozlamalar uchun @AppStorage
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Foydalanuvchi sozlamalari — ilova yopilsa ham saqlanishi kerak bo'lgan konfiguratsiyalar. Qorong'u rejim tanlovi, bildirishnomaga ruxsat, ko'rinish nomi, kirish jarayonini tugatganmi — bular persistentlikni talab qiladi.
9-bosqichda @AppStorage UserDefaults ga avtomatik yozishini o'rganganingiz. Bu darsda uni haqiqiy sozlamalar ekranida ishlatasiz.
Swift•
import SwiftUI
struct SozlamalarKorinishi: View {
// @AppStorage UserDefaults dan avtomatik o'qiydi va yozadi
@AppStorage("userDisplayName") private var displayName = ""
// Bool sozlamasi — ilovalar orasida saqlanadi
@AppStorage("notificationsEnabled") private var notificationsEnabled = false
// Rang sxemasini boshqaruvchi String sozlamasi
@AppStorage("themePreference") private var themePreference = "system"
var body: some View {
Form {
Section("Profil") {
// TextField to'g'ridan-to'g'ri @AppStorage xususiyatiga bog'langan
TextField("Ko'rinish nomi", text: $displayName)
}
Section("Bildirishnomalar") {
// Toggle saqlangan Bool ni to'g'ridan-to'g'ri o'qiydi va yozadi
Toggle("Bildirishnomalarni yoqish", isOn: $notificationsEnabled)
}
Section("Ko'rinish") {
// Picker saqlangan String ni boshqaradi
Picker("Mavzu", selection: $themePreference) {
Text("Tizim").tag("system")
Text("Yorug'").tag("light")
Text("Qorong'u").tag("dark")
}
.pickerStyle(.segmented)
}
}
.navigationTitle("Sozlamalar")
// Foydalanuvchi tanlagan mavzuni butun ko'rinishga qo'llash
.preferredColorScheme(rangSxemasi(themePreference))
}
// Saqlangan String ni SwiftUI ColorScheme ga aylantirish
private func rangSxemasi(_ sozlama: String) -> ColorScheme? {
switch sozlama {
case "light": return .light
case "dark": return .dark
default: return nil // nil = tizim sozlamasiga bo'ysunish
}
}
}
| Qator | Vazifasi |
|---|---|
@AppStorage("kalit") var qiymat = standart | Persistent xususiyat. Kalit UserDefaults da saqlash uchun ishlatiladi. Standart faqat birinchi marta ishlatiladi. |
TextField("...", text: $displayName) | @AppStorage xususiyatiga binding — @State bilan bir xil sintaksis. Har bir tugma bosishda saqlaydi. |
Toggle("...", isOn: $notificationsEnabled) | Saqlangan Bool ni to'g'ridan-to'g'ri boshqaradi. Kalitni almastirganda UserDefaults yangilanadi. |
.preferredColorScheme(rangSxemasi(...)) | Saqlangan tanlanga asosida rang sxemasini qo'llaydi. |
return nil | Tizim rang sxemasiga bo'ysunish. nil = follow system. |
Ko'p viewda ulashish
// SozlamalarKorinishi da
@AppStorage("notificationsEnabled") private var notificationsEnabled = false
// ProfilKorinishi da — bir xil kalit, har doim bir xil saqlangan qiymat o'qiladi
@AppStorage("notificationsEnabled") private var notificationsEnabled = false
// Biri o'zgarsa, bir xil kalitga ega barcha viewlar qayta render qiladi
// Binding uzatish shart emas — kalit o'zi aloqa o'rnatadi
Kalit nomlashtirish
// ✅ Yaxshi — aniq, namespace qilingan
@AppStorage("com.meningIlovam.notificationsEnabled") var notifications = false
@AppStorage("com.meningIlovam.displayName") var name = ""
// ❌ Yomon — qisqa, collision xavfi
@AppStorage("notifications") var notifications = false
@AppStorage("name") var name = ""
Qo'llab-quvvatlanadigan turlar
@AppStorage("ism") var ism = "" // String
@AppStorage("yoshiRoziman") var yoshi = false // Bool
@AppStorage("ekranDaqiqalar") var daqiqalar = 0 // Int
@AppStorage("balandlik") var balandlik = 1.75 // Double
@AppStorage("xom") var xom = Data() // Data
// RawRepresentable enum
enum Mavzu: String { case system, light, dark }
@AppStorage("mavzu") var mavzu: Mavzu = .system
App Group — widget bilan ulashish
// Widget extension va ilova sozlamalarini ulashish
@AppStorage("widgetYoqildi", store: UserDefaults(suiteName: "group.com.meningIlovam"))
private var widgetYoqildi = false
Tezkor ma'lumotnoma
| Sintaksis | Vazifasi |
|---|---|
@AppStorage("kalit") var x = standart | Persistent @State — UserDefaults bilan sinxron |
$x | @State kabi binding sintaksisi |
| Bir xil kalit = sinxron viewlar | Ko'p view bir xil qiymatni ko'radi va yangilaydi |
store: UserDefaults(suiteName:) | App Group — widget/extension bilan ulashish |
🎯 Topshiriq: sozlamalar ekrani
Uch xususiyatli sozlamalar ekrani yarating: ism matni maydoni, bildirishnoma toggle va mavzu Picker. Barcha xususiyatlar uchun @AppStorage ishlating. Ilovani yoping va qayta oching — sozlamalar saqlanganini tasdiqlang. Bir xil kalitni boshqa viewda ham ishlating — qiymat o'zgarganda sinxron yangilanishini ko'ring.