Published on

Ma'lumot kiritishni tekshirish usullari

Authors

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
ContentView.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

PatternKod
Xato computed propertyvar xato: String? { ... return nil }
Barcha tekshiruvlarvar yaroqli: Bool { xato1 == nil && xato2 == nil }
Tugmani o'chirish.disabled(!yaroqli)
Inline xato ko'rsatishif 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

MavzuAsosiy fikr
TextField va SecureFieldMatn va parol kiritish. .keyboardType(), .submitLabel(), .autocorrectionDisabled() bilan moslashtiring.
Toggle, Slider, StepperYoqish/o'chirish, uzluksiz va diskret qiymatlar uchun. Barchasi @State-ga bog'lanadi.
PickerEnum + CaseIterable + Identifiable bilan. .segmented 2-4 uchun, .menu ko'p uchun, .wheel ro'yxatlar uchun.
DatePickerDate tipiga bog'lanadi. displayedComponents va in: bilan cheklang.
Form va SectioniOS sozlamalar uslumi. Toggle, Picker, TextField-lar avtomatik to'g'ri ko'rinish oladi.
@FocusStateKlaviaturani dasturiy boshqarish. Bool bitta maydon uchun, enum ko'p maydon uchun.
ValidatsiyaComputed 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.

Buy mea coffee