【问题标题】:(SOLVED) Pre-enter text in a textfield in SwiftUI(已解决)在 SwiftUI 的文本字段中预输入文本
【发布时间】:2021-02-21 08:09:47
【问题描述】:

我能够解决我之前遇到的关于如何通过 UI 更新 Firestore 中的数据的问题。现在下一个问题: 我想在文本字段中预先输入我的 Firebase 存储数据,这样您就可以!编辑!您想要的字段中的文本,而不是在每个字段中写入所有新数据。如您所见,我唯一能做的是将文本字段中存储的数据作为占位符获取,这意味着您必须重写所有数据以防您只想更新 1 个字段。

代码:

import SwiftUI
import Firebase

struct ContentViewVier: View {
    
    @ObservedObject var dataDrei = getDataZwei()
    
    var body: some View {
       
        NavigationView{
            
            ZStack(alignment: .top){
                
                GeometryReader{_ in
                    
                    // Home View....
                    Text("Bitte Seriennummer eingeben").foregroundColor(.black)
                    
                }.background(Color("FarbeSeriennummerStartbildschirm").edgesIgnoringSafeArea(.all))
                
                CustomSearchBarEdit(dataZwei: self.$dataDrei.datasZwei).padding(.top)
                
            }.navigationBarTitle("")
            .navigationBarHidden(true)
        }
    }
}


struct CustomSearchBarEdit : View {
    
    @State var txt = ""
    @Binding var dataZwei : [dataTypeZwei]
    
    var body : some View{
        
        VStack(spacing: 0){
            
            HStack{
                
                TextField("Nach Seriennummer suchen", text: self.$txt).opacity(100).foregroundColor(.black)
                
                if self.txt != ""{
                    
                    Button(action: {
                        
                        self.txt = ""
                        
                    }) {
                        
                        Text("Abbrechen")
                    }
                    .foregroundColor(.black)
                    
                }

            }.padding()
            
            if self.txt != ""{
                
                if
                    self.dataZwei.filter({$0.sn.lowercased() .contains(self.txt.lowercased())}).count == 0 {
                        
                    Text("Es wurde kein Gerät mit dieser Seriennummer gefunden").foregroundColor(Color.red.opacity(0.6)).padding()
                    
                }
                
                else{
                    
                    List(self.dataZwei.filter{$0.sn.contains(self.txt.lowercased())}){j in
                            
                        NavigationLink(destination: DetailZwei(data: j)) {
                        
                        Text(j.sn)
                    }
                         
                        Text(j.typ)
                    
                        
                    }.frame(height: UIScreen.main.bounds.height / 5)
                    
                }

            }
        
            
            
        }.background(Color.white)
        .padding()
    }
}

class getDataZwei : ObservableObject{
    
    @Published var datasZwei = [dataTypeZwei]()
    
    init() {
        
        let db = Firestore.firestore()
        
        db.collection("Geräte").getDocuments { (snap, err) in
            
            if err != nil{
                
                print((err?.localizedDescription)!)
                return
            }
            
            for i in snap!.documents{
                
                let id = i.documentID
                let sn = i.get("Seriennummer") as! String
                let objekt = i.get("Objekt") as! String
                let str = i.get("Strasse") as! String
                let pos = i.get("Position") as! String
                let typ = i.get("Gerätetyp") as! String
                let ida = i.get("Installation")as! String
                let lg = i.get("LeasingOderGekauft")as! String
                let la = i.get("LeasingAblaufdatum")as! String
                let ga = i.get("GarantieAblaufdatum")as! String
                let nr = i.get("Hausnummer")as! String
                let plz = i.get("Postleitzahl")as! String
                let ort = i.get("Ort")as! String
                let vp = i.get("Verantwortlich")as! String
                let tel = i.get("Telefonnummer")as! String
                let zusatz = i.get("Zusätzlich")as! String
                let ed = i.get("EingetragenDurch")as! String
                let ldvds = i.get("LieferungBeiVDS")as! String
                
                self.datasZwei.append(dataTypeZwei(id: id, sn: sn, pos: pos, typ: typ, ida: ida, lg: lg, la: la, ga: ga, objekt: objekt, str: str, nr: nr, plz: plz, ort: ort, vp: vp, tel: tel, zusatz: zusatz, ed: ed, ldvds: ldvds))
            }
        }
    }
}

struct dataTypeZwei : Identifiable, Codable {
    
    var id: String? = UUID().uuidString
    var sn : String
    var pos : String
    var typ : String
    var ida : String
    var lg : String
    var la : String
    var ga : String
    var objekt : String
    var str : String
    var nr : String
    var plz : String
    var ort : String
    var vp : String
    var tel : String
    var zusatz : String
    var ed : String
    var ldvds : String
    
    enum CodingKeys: String, CodingKey {
        case sn = "Seriennummer"
        case objekt = "Objekt"
        case str = "Strasse"
        case nr = "Hausnummer"
        case ort = "Ort"
        case vp = "Verantwortlich"
        case tel = "Telefonnummer"
        case pos = "Position"
        case typ = "Gerätetyp"
        case ida = "Installation"
        case lg = "LeasingOderGekauft"
        case la = "LeasingAblaufdatum"
        case ga = "GarantieAblaufdatum"
        case zusatz = "Zusätzlich"
        case plz = "Postleitzahl"
        case ed = "EingetragenDurch"
        case ldvds = "LieferungBeiVDS"
    }
}

struct DetailZwei : View {
    
    
   var data : dataTypeZwei
    @State var viewModel = GerätEditieren()
    @State var serie: String? = nil
    @Environment(\.presentationMode) var presentationMode
    
    
    var body : some View {
        
        NavigationView {
            ScrollView {
                Group {
            Section(header: Text("Gerät")) {
                Text("Seriennummer")
                TextField(data.sn, text: $viewModel.gerät.sn).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Objekt")
            TextField(data.objekt, text: $viewModel.gerät.objekt).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Gerätetyp")
            TextField(data.typ, text: $viewModel.gerät.typ).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Geräteposition")
            TextField(data.pos, text: $viewModel.gerät.pos).textFieldStyle(RoundedBorderTextFieldStyle())
                    }
                    Group {
                Text("Installationsdatum")
            TextField(data.ida, text: $viewModel.gerät.ida).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Leasing oder Gekauft?")
            TextField(data.lg, text: $viewModel.gerät.lg).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Ablaufdatum Leasing")
            TextField(data.la, text: $viewModel.gerät.la).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Ablaufdatum Garantie")
            TextField(data.ga, text: $viewModel.gerät.ga).textFieldStyle(RoundedBorderTextFieldStyle())
            }
                    
            Section(header: Text("Adresse")) {
                Text("Strasse")
            TextField(data.str, text: $viewModel.gerät.str).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Hausnummer")
            TextField(data.nr, text: $viewModel.gerät.nr).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Postleitzahl")
            TextField(data.plz, text: $viewModel.gerät.plz).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Ort")
            TextField(data.ort, text: $viewModel.gerät.ort).textFieldStyle(RoundedBorderTextFieldStyle())
            }
                
            Section(header: Text("Kontakt")) {
                Text("Ansprechperson")
            TextField(data.vp, text: $viewModel.gerät.vp).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Telefonnummer")
            TextField(data.tel, text: $viewModel.gerät.tel).textFieldStyle(RoundedBorderTextFieldStyle())
            }
            Section(header: Text("VDS")) {
                Text("Eingetragen durch")
                TextField(data.ed, text: $viewModel.gerät.ed).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Lieferdatum VDS")
                TextField(data.ldvds, text: $viewModel.gerät.ldvds).textFieldStyle(RoundedBorderTextFieldStyle())
            }
            
            Section(header: Text("Zusätzliche Informationen")) {
                Text("Zusätzliche Informationen")
            TextField(data.zusatz, text: $viewModel.gerät.zusatz).textFieldStyle(RoundedBorderTextFieldStyle())
            }
            }.padding()
            
            .navigationBarTitle("Gerät bearbeiten", displayMode: .inline)
                    .navigationBarItems(leading: Button(action: { self.handleCancelTapped() }, label: {
                        Text("Abbrechen")
                    }),
                                        trailing: Button(action: { self.handleDoneTapped() }, label: {
                                            Text("Speichern")
                    })
                   // .disabled(!viewModel.modified)
                )
            }
            }
    }
                func handleCancelTapped() {
                dismiss()
                }
                func handleDoneTapped() {
                    
                    let db = Firestore.firestore()
                    
                    let docRef = db.collection("Geräte").document(data.id!)
                    print("setting data")
                    docRef.updateData(["Seriennummer": "\(viewModel.gerät.sn)", "Objekt": "\(viewModel.gerät.objekt)", "Strasse": "\(viewModel.gerät.str)", "Hausnummer": "\(viewModel.gerät.nr)", "Ort": "\(viewModel.gerät.ort)", "Verantwortlich": "\(viewModel.gerät.vp)", "Telefonnummer": "\(viewModel.gerät.tel)", "Position": "\(viewModel.gerät.pos)", "Gerätetyp": "\(viewModel.gerät.typ)", "Installation": "\(viewModel.gerät.ida)", "LeasingOderGekauft": "\(viewModel.gerät.lg)", "LeasingAblaufdatum": "\(viewModel.gerät.la)", "GarantieAblaufdatum": "\(viewModel.gerät.ga)", "Zusätzlich": "\(viewModel.gerät.zusatz)", "Postleitzahl": "\(viewModel.gerät.plz)", "EingetragenDurch": "\(viewModel.gerät.ed)", "LieferungBeiVDS": "\(viewModel.gerät.ldvds)"]){ (error) in
                        if let error = error {
                            print("error = \(error)")
                        } else if self.viewModel.gerät.sn == "" {
                            self.viewModel.gerät.sn = self.data.sn
                        }
                        else {
                            print("data uploaded successfully")
                    }
                    }
                    dismiss()
    }
                
                
                
                func dismiss() {
                    presentationMode.wrappedValue.dismiss()
                }
    }







struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentViewVier()
    }
}

【问题讨论】:

  • 嘿@Merdis,既然你的问题已经解决了,你可以在这里发布你的解决方案吗?

标签: xcode google-cloud-firestore swiftui textfield


【解决方案1】:

这属于您的 viewModel 以使用确切的值初始化 Published 值。

另一个选项是设置 State 变量,您可以将其传递给 TextField 的实际值。

@State var vp : String 

init(data: Data) { 
    self._vp = State(initialValue: data.vp) //<< here set the value from Firebase
}

TextField(data.vp, text: $vp).textFieldStyle(RoundedBorderTextFieldStyle())

【讨论】:

  • 但是您的解决方案似乎无法更改已存储在云端的值,是吗?
  • 你的 sn-p 应该放在哪里?
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 2014-02-28
  • 2013-10-08
  • 2019-03-14
相关资源
最近更新 更多