Как автоматически заполнить текстовое поле в SwiftUI?

#swift #swiftui #uitextfield #swiftui-form

#быстрый #swiftui #uitextfield uitextfield #swiftui-форма

Вопрос:

Я создаю приложение, которое использует форму в SwiftUI, и я хотел бы редактировать объекты, хранящиеся локально, используя указанные формы.

В этом случае у меня есть торт и печенье, которые должны храниться в памяти, и у меня есть две структуры, одна для торта и одна для печенья.

Когда пользователь выбирает, что он / она хочет отредактировать, торт или печенье, поля формы должны автоматически заполняться свойствами фактически сохраненного торта или печенья, которые можно редактировать.

Структуры:

 import Foundation

struct Cake {
    var name : String
    var style : String
    var decorations : String
}

struct Cookie{
    var name : String
    var style : String
}
 

Код, который я использую для представления:

 import SwiftUI

struct EditingForm: View {
    @State var cake : Cake = Cake(name: "Caprese", style: "Chocolate cake made with almonds flour", decorations: "Powdered Sugar")
    
    @State var cookie : Cookie = Cookie(name: "Chocolate Chip", style: "Cookie made with chocolate chips")
    
    @State var group : String = "Cake"
    @State var nameCake : String = ""
    @State var nameCookie : String = ""
    @State var styleCake : String = ""
    @State var cookiesChocolateChipsType : String = ""
    
    var body: some View {
        ZStack{
            Form{
                Section(header: Text("Sweet Details")
                ){
                    Menu("Select the sweet you want to edit") {
                        Button(action: {
                            group = "Cake"
                        }) {
                            Text("Cake")
                        }.foregroundColor(.black)
                        
                        Button(action: {
                            group = "Cookie"
                        }) {
                            Text("Cookie")
                        }
                    }
                }
                
                Section(header: Text("Decorations")
                ){
                    if(group == "Cake"){
                        TextField("Name of the cake", text: $nameCake)
                        TextField("Style of the cake", text: $styleCake)
                    } else if (group == "Cookie"){
                        TextField("Name of the cookie", text: $nameCookie)
                        TextField("Type of chocolate chips for the cookie", text: $cookiesChocolateChipsType)
                    }
                }
            }
        }
    }
    
}
 

Ответ №1:

Вы можете просто использовать .onAppear() {} модификатор. Это означает, что ваш @State var получает обновление при появлении представления.

В вашем примере код будет выглядеть так:

 import SwiftUI

struct EditingForm: View {
    @State var cake : Cake = Cake(name: "Caprese", style: "Chocolate cake made with almonds flour", decorations: "Powdered Sugar")
    
    @State var cookie : Cookie = Cookie(name: "Chocolate Chip", style: "Cookie made with chocolate chips")
    
    @State var group : String = "Cake"
    @State var nameCake : String = ""
    @State var nameCookie : String = ""
    @State var styleCake : String = ""
    @State var cookiesChocolateChipsType : String = ""
    
    var body: some View {
        ZStack{
            Form{
                Section(header: Text("Sweet Details")
                ){
                    Menu("Select the sweet you want to edit") {
                        Button(action: {
                            group = "Cake"
                        }) {
                            Text("Cake")
                        }.foregroundColor(.black)
                        
                        Button(action: {
                            group = "Cookie"
                        }) {
                            Text("Cookie")
                        }
                    }
                }
                
                Section(header: Text("Decorations")
                ){
                    if(group == "Cake"){
                        TextField("Name of the cake", text: $nameCake).onAppear() {
                          self.nameCake = self.cake.name
                        }
                        TextField("Style of the cake", text: $styleCake).onAppear() {
                          self.styleCake = self.cake.style
                        }
                    } else if (group == "Cookie"){
                        TextField("Name of the cookie", text: $nameCookie).onAppear() {
                          self.nameCookie = self.cookie.name
                        }
                        TextField("Type of chocolate chips for the cookie", text: $cookiesChocolateChipsType).onAppear() {
                          self.cookiesChocolateChipsType = self.cookie.style
                        }
                    }
                }
            }
        }
    }
    
}
 

Надеюсь, это поможет решить вашу проблему.

Комментарии:

1. возможно ли то же самое для webview в приложении SwiftUI?

2. @HumbleDeveloper01 Я не совсем понимаю, какое поведение вы имеете в виду. Не могли бы вы объяснить это немного подробнее или показать какие-либо примеры?

3. Я имею в виду, как мы можем использовать автозаполнение для WKWebView из SwiftUI login в view в webview login view?