- Published on
Ma'lumot kiritishni tekshirish usullari
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Ma'lumot kiritishni tekshirish usullari
Ro'yxatdan o'tish formasida "Hisob yaratish" tugmasini bosasiz β "Parol kamida 8 ta belgi bo'lishi kerak" degan xato xabar chiqadi. Bu yerda dastur formani tekshirgan. Bu SwiftUI-dagi validatsiya patternlari β @State asosida computed propertylar.
SwiftUI validatsiyasining asosiy g'oyasi: @State o'zgaruvchiga qarab computed property xato qiymat yoki nil qaytaradi. nil β maydon yaroqli. Xato matni β nima noto'g'ri ekanligini aytadi. Bu xatoni ko'rsatadigan Text va tugmani o'chiradigan .disabled() uchun ishlatiladi.
Swiftβ’
import SwiftUI
struct ContentView: View {
@State private var username = ""
@State private var parol = ""
@State private var parolTasdiqi = ""
// Computed property: xato bo'lsa String qaytaradi, yaroqli bo'lsa nil
var usernameXato: String? {
if username.isEmpty { return "Foydalanuvchi nomi talab etiladi" }
if username.count < 3 { return "Kamida 3 ta belgi bo'lishi kerak" }
return nil
}
var parolXato: String? {
if parol.count < 8 { return "Kamida 8 ta belgi bo'lishi kerak" }
if parol != parolTasdiqi { return "Parollar mos kelmaydi" }
return nil
}
// Barcha tekshiruvlarni bitta boolean-ga birlashtirish
var formulaYaroqli: Bool {
usernameXato == nil && parolXato == nil && !parolTasdiqi.isEmpty
}
var body: some View {
VStack(alignment: .leading, spacing: 12) {
TextField("Foydalanuvchi nomi", text: $username)
.textFieldStyle(.roundedBorder)
// Xatoni faqat foydalanuvchi yoza boshlaganidan keyin ko'rsatish
if let xato = usernameXato, !username.isEmpty {
Text(xato).foregroundStyle(.red).font(.caption)
}
SecureField("Parol", text: $parol)
.textFieldStyle(.roundedBorder)
SecureField("Parolni tasdiqlang", text: $parolTasdiqi)
.textFieldStyle(.roundedBorder)
if let xato = parolXato, !parolTasdiqi.isEmpty {
Text(xato).foregroundStyle(.red).font(.caption)
}
// Tugma faqat barcha tekshiruvlar o'tsa faol bo'ladi
Button("Hisob yaratish") {
print("\(username) uchun hisob yaratildi")
}
.buttonStyle(.borderedProminent)
.disabled(!formulaYaroqli)
.frame(maxWidth: .infinity)
}
.padding()
}
}
Kengaytirilgan usullar
Email format tekshiruvi
var emailXato: String? {
if email.isEmpty { return "Email talab etiladi" }
// Asosiy tekshiruv: @ va nuqta borligini tekshirish
if !email.contains("@") || !email.contains(".") {
return "To'g'ri email manzil kiriting"
}
return nil
}
Chegara rangi bilan vizual xato
TextField("Foydalanuvchi nomi", text: $username)
.padding(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(
// Noto'g'ri va yozilgan bo'lsa qizil, aks holda kulrang
usernameXato != nil && !username.isEmpty
? Color.red
: Color.gray.opacity(0.4),
lineWidth: 1.5
)
)
Belgilar limiti (Twitter uslumi)
TextField("Bio", text: $bio)
.onChange(of: bio) { _, yangiQiymat in
// Limit oshsa qirqib qo'yish
if yangiQiymat.count > 160 {
bio = String(yangiQiymat.prefix(160))
}
}
// Qolgan belgilar soni β 140 dan so'ng qizil
Text("\(160 - bio.count) belgi qoldi")
.foregroundStyle(bio.count > 140 ? .red : .secondary)
.font(.caption)
Tezkor ma'lumotnoma
| Pattern | Kod |
|---|---|
| Xato computed property | var xato: String? { ... return nil } |
| Barcha tekshiruvlar | var yaroqli: Bool { xato1 == nil && xato2 == nil } |
| Tugmani o'chirish | .disabled(!yaroqli) |
| Inline xato ko'rsatish | if let xato = maydonXato, !maydon.isEmpty { Text(xato) } |
| Belgilar limiti | .onChange(of:) { if count > limit { trim } } |
| Chegara rangi | .overlay(RoundedRectangle.stroke(color, lineWidth:)) |
Stage 6 xulosa: formalar va foydalanuvchi kirishi
| Mavzu | Asosiy fikr |
|---|---|
| TextField va SecureField | Matn va parol kiritish. .keyboardType(), .submitLabel(), .autocorrectionDisabled() bilan moslashtiring. |
| Toggle, Slider, Stepper | Yoqish/o'chirish, uzluksiz va diskret qiymatlar uchun. Barchasi @State-ga bog'lanadi. |
| Picker | Enum + CaseIterable + Identifiable bilan. .segmented 2-4 uchun, .menu ko'p uchun, .wheel ro'yxatlar uchun. |
| DatePicker | Date tipiga bog'lanadi. displayedComponents va in: bilan cheklang. |
| Form va Section | iOS sozlamalar uslumi. Toggle, Picker, TextField-lar avtomatik to'g'ri ko'rinish oladi. |
| @FocusState | Klaviaturani dasturiy boshqarish. Bool bitta maydon uchun, enum ko'p maydon uchun. |
| Validatsiya | Computed property-lar xato qaytaradi yoki nil. isFormValid .disabled() ni boshqaradi. |
Keyingi: Stage 7 β State va Data Flow. @ObservableObject, @EnvironmentObject, source of truth va ko'p view-lar orasida ma'lumot ulashish.