【发布时间】:2020-05-30 17:28:50
【问题描述】:
我有一组可识别的培训元素。每个 Training 元素只有两个属性,name 和 isRequired。
将数组元素的现有值更新为新的编辑值的最直接(最快捷)的方法是什么...编辑后的值随后将提交到数据库。
是否可以将EditTraining 视图(子)中的状态设置为传入的(父)值,然后在子视图中编辑状态?
我被困在这个问题上的时间比我承认的要长。
非常感谢您的帮助!
代码如下:
import SwiftUI
struct Training: Identifiable {
let id: String
let trainingName: String
let isRequired: Bool
}
class GetTrainings: ObservableObject {
@Published var items = [Training]()
init() {
self.items = [
Training(id: "ttt1", trainingName: "Safety", isRequired: true),
Training(id: "ttt2", trainingName: "Administrative", isRequired: false),
Training(id: "ttt3", trainingName: "Computer", isRequired: true),
Training(id: "ttt4", trainingName: "People", isRequired: true),
Training(id: "ttt5", trainingName: "Managerial", isRequired: true),
]
}
}
struct TrainingList: View {
@ObservedObject var trainings = GetTrainings()
var body: some View {
NavigationView {
VStack {
List {
ForEach(trainings.items) { training in
HStack {
NavigationLink(destination: TrainingView(training: training)) {
Text("\(training.trainingName)")
}
}
}
}
}.navigationBarTitle("Training List")
}
}
}
struct TrainingView: View {
var training: Training
var body: some View {
VStack {
Text("\(training.trainingName)").font(.body)
Text("\(training.isRequired == true ? "Required Training" : "Training Not Required")")
HStack {
NavigationLink(destination: EditTraining(training: training)) {
Text("Edit Training Details")
}
}
}.navigationBarTitle("\(training.trainingName) Page", displayMode: .inline)
}
}
struct EditTraining: View {
var training: Training
// Can I set the state values to the passed in values ???
@State private var newName: String = ""
@State private var isRequiredTraining: Bool = false
//@Binding var name: String = training.trainingName ????
private func submitData() {
let newName = self.newName
let newBoolVal = self.isRequiredTraining
print("Firebase Sync Id is :\(training.id) Text: \(newName) and Bool: \(newBoolVal)")
}
var body: some View {
VStack {
Form {
Section (header: Text("Edit")) {
Text("\(training.trainingName)")
/* TextField should Populate With passed In Training Name Here*/
TextField("New Name", text: self.$newName)
Toggle(isOn: self.$isRequiredTraining) {
Text("Is Required")
}
}
Section {
Button(action: {
self.submitData()
}) {
Text("Submit")
}
}
}
}.navigationBarTitle("Edit Training Page", displayMode: .inline)
}
}
struct ContentView: View {
var body: some View {
VStack {
TrainingList()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
【问题讨论】: