Published on

Klaviatura boshqaruvi va @FocusState

Authors

Login sahifasini oching β€” birinchi maydonni toldirdingiz, "Next" bosdingiz, klaviatura parol maydoniga o'tdi. Bu @FocusState. Foydalanuvchi nomini to'ldirdi, "Continue" bosdi β€” klaviatura yopildi va keyingi ekran ochildi. Bu ham @FocusState.

Focus β€” foydalanuvchining diqqati qaysi maydondaligi. @FocusState dasturingizdan fokusni boshqarish imkonini beradi: klaviaturani ochish, yopish, maydonlar orasida o'tish β€” barchasi kod bilan.

Agar bitta maydon bo'lsa Bool ishlating. Bir nechta maydon bo'lsa enum ishlating β€” har bir holat bitta maydonga to'g'ri keladi.

Swift
ContentView.swift
import SwiftUI struct ContentView: View { @State private var ism = "" @State private var familiya = "" @State private var email = "" // Enum β€” har bir maydon uchun alohida holat enum Maydon { case ism, familiya, email } // @FocusState: qaysi maydon aktiv ekanligini boshqaradi @FocusState private var faolMaydon: Maydon? var body: some View { VStack(spacing: 16) { TextField("Ism", text: $ism) .textFieldStyle(.roundedBorder) // Bu maydoni .ism holatiga ulash .focused($faolMaydon, equals: .ism) .submitLabel(.next) .onSubmit { faolMaydon = .familiya } TextField("Familiya", text: $familiya) .textFieldStyle(.roundedBorder) .focused($faolMaydon, equals: .familiya) .submitLabel(.next) .onSubmit { faolMaydon = .email } TextField("Email", text: $email) .textFieldStyle(.roundedBorder) .focused($faolMaydon, equals: .email) .keyboardType(.emailAddress) .submitLabel(.done) .onSubmit { faolMaydon = nil } // klaviaturani yopadi Button("Davom etish") { faolMaydon = nil // klaviaturani yopadi print("\(ism) \(familiya) β€” \(email)") } .buttonStyle(.borderedProminent) } .padding() // Sahifa ochilganda ism maydoniga avtomatik focus .onAppear { faolMaydon = .ism } // Bo'sh joyga bosishda klaviaturani yopish .onTapGesture { faolMaydon = nil } } }

Focus patternlari

Bitta maydon uchun Bool @FocusState

@FocusState private var ismFaol: Bool

TextField("Ism", text: $ism)
    .focused($ismFaol)

// Dasturiy ravishda focus qo'yish
Button("Maydonga o'tish") {
    ismFaol = true
}

Klaviatura yopishni .toolbar orqali

TextField("Izoh", text: $izoh)
    .focused($izohFaol)

.toolbar {
    ToolbarItemGroup(placement: .keyboard) {
        Spacer()
        Button("Yopish") {
            izohFaol = false
        }
    }
}

Klaviatura ustida "Yopish" tugmasi qo'yadi β€” uzun form va ko'p qatorli matn uchun qulay.

Muhim: @FocusState faqat simulyator yoki haqiqiy qurilmada sinab ko'rilganda to'g'ri ishlaydi. Xcode canvas preview da klaviatura chiqmaydi va focus holat o'zgarishlarining ko'rinadigan ta'siri yo'q. Bu dars uchun klaviatura xatti-harakatini har doim simulyatorda sinab ko'ring.

Tezkor ma'lumotnoma

SintaksisVazifasi
@FocusState private var faol: BoolBitta maydon focus holati
@FocusState private var maydon: MaydOn?Bir nechta maydon orasida focus
.focused($faol)Bool @FocusState-ga ulash
.focused($maydon, equals: .ism)Enum @FocusState-ga ulash
faol = trueKlaviaturani dasturiy ochish
faol = false / maydon = nilKlaviaturani dasturiy yopish
.onAppear { faol = true }Sahifa ochilganda avtomatik focus
.submitLabel(.next)Return tugmasini "Next" qilish

Topshiriq: ro'yxatdan o'tish formi

Ism, Familiya, Email, Parol β€” to'rtta TextField/SecureField yarating. Enum @FocusState bilan maydonlar orasida ketma-ket o'tishni sozlang (Next tugmasi). Oxirgi maydonda Return bosilganda klaviatura yopilsin. Sahifa ochilganda ism maydoniga avtomatik focus qo'ying.

Buy mea coffee