When I edit DetailView in EditingView new values look good between each other, but when I back to my ListView, everything without new values. In consol, I see that elements in the array aren't changed. Help me please.
struct ClientsListView: View {
@EnvironmentObject var clientsModel: ClientViewModel
var body: some View {
VStack(alignment: .leading){
ForEach(clientsModel.clientsModel){ client in
NavigationLink(
destination: ClientDetailHost(client: client),
label: {
ClientRowView(name: client.name, address: client.address, email: client.email)
})
Divider()
}
}.padding()
}
}
struct ClientsListView_Previews: PreviewProvider {
static var previews: some View {
ClientsListView()
.environmentObject(ClientViewModel())
}
}
struct ClientDetailEditing: View {
@Binding var client: Client
@Environment(\.editMode) var editMode
var body: some View {
VStack{
AddClientRow(itemName: "Name", iconName: "person", keyboardType: .namePhonePad ,bindingItem: $client.name)
AddClientRow(itemName: "Email", iconName: "envelope", keyboardType: .emailAddress ,bindingItem: $client.email)
AddClientRow(itemName: "Mobile", iconName: "phone.fill", keyboardType: .phonePad ,bindingItem: $client.mobile)
AddClientRow(itemName: "Phone", iconName: "phone", keyboardType: .phonePad ,bindingItem: $client.phone)
AddClientRow(itemName: "Address", iconName: "map", keyboardType: .default ,bindingItem: $client.address)
AddClientRow(itemName: "Shipping Address", iconName: "shippingbox", keyboardType: .default ,bindingItem: $client.billingAddress)
}
}
}
struct ClientDetailHost: View {
@Environment(\.editMode) var editMode
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var clientsModel: ClientViewModel
@State private var draftClient = Client.default
@State var client: Client
@State var isBackHidden: Bool = false
var body: some View {
VStack{
if editMode?.wrappedValue == .inactive {
ClientDetailView(client: client)
} else {
ClientDetailEditing(client: $draftClient)
.onAppear {
draftClient = client
isBackHidden.toggle()
print("onAppear")
print(client)
}
.onDisappear {
client = draftClient
isBackHidden.toggle()
print("onDisappear")
print(client)
}
}
if editMode?.wrappedValue == .active {
Button("Cancel") {
draftClient = clientsModel.client
editMode?.animation().wrappedValue = .inactive}
Spacer()
}
}
.navigationBarBackButtonHidden(isBackHidden)
.navigationBarItems(leading: Text(""), trailing: EditButton())
}
}
struct ClientDetailView: View {
@EnvironmentObject var clientsModel: ClientViewModel
let client: Client
@State var clientName: String = ""
@State var clientEmail: String = ""
@State var clientPhone: String = ""
@State var clientMobile: String = ""
@State var clientAddress: String = """
"""
@State var clientBillingAddress: String = """
"""
@State var isSave: Bool = false
@Environment(\.presentationMode) var presentationMode
var body: some View {
ScrollView{
VStack{
Text("\(client.name)")
.font(/*@START_MENU_TOKEN@*/.title/*@END_MENU_TOKEN@*/)
.bold()
.padding(.vertical)
HStack(alignment: .center){
ActionItem(imageName: "message", text: "message")
ActionItem(imageName: "phone", text: "call")
ActionItem(imageName: "envelope", text: "mail")
ActionItem(imageName: "square.and.pencil", text: "edit")
}
Divider()
VStack(alignment: .leading){
ClientInfoItem(itemname: "mobile", itemvalue: "\(client.mobile)")
ClientInfoItem(itemname: "email", itemvalue: "\(client.email)")
ClientInfoItem(itemname: "phone", itemvalue: "\(client.phone)")
ClientInfoAddress(itemname: "address", itemvalue: "\(client.address)")
ClientInfoAddress(itemname: "billing address", itemvalue: "\(client.billingAddress)")
}
}.padding(.horizontal)
}
.navigationBarBackButtonHidden(false)
.navigationBarTitleDisplayMode(.inline)
}
}
struct ActionItem: View {
var imageName: String
var text: String
var body: some View {
VStack{
ZStack{
RoundedRectangle(cornerRadius: 10)
.frame(width: 70, height: 70)
.foregroundColor(Color(.systemGray6))
VStack{
Image(systemName: imageName)
.font(.title)
.foregroundColor(/*@START_MENU_TOKEN@*/.blue/*@END_MENU_TOKEN@*/)
//.padding(.vertical,2)
Text(text)
.font(.caption)
}
}.padding(.all, 7)
}
}
}
struct ClientInfoItem: View {
var itemname: String
var itemvalue: String
var body: some View{
ZStack(alignment: .leading){
RoundedRectangle(cornerRadius: 10)
.frame(height: 70)
.foregroundColor(Color(.systemGray6))
VStack(alignment: .leading){
Text(itemname)
Spacer()
Text(itemvalue)
.foregroundColor(.blue)
}.padding()
}
.font(.title3)
}
}
struct ClientInfoAddress: View {
var itemname: String
var itemvalue: String
var body: some View{
// ZStack(alignment: .leading){
// RoundedRectangle(cornerRadius: 10)
// .foregroundColor(Color(.systemGray6))
VStack(alignment: .leading){
Text(itemname)
.padding(.vertical, 3)
Text(itemvalue)
.font(.callout)
.foregroundColor(.blue)
.bold()
}
.font(.title3)
.padding(.vertical, 2)
}
}