Home > Net >  SwiftUI - Save status when language is selected
SwiftUI - Save status when language is selected

Time:10-25

I have successfully displayed the language in the UI, but I have a problem: when I click the "Save" button it still doesn't save the language I selected.

I want when I have selected the language and clicked the Save Button , it will return to the previous page and when I click it again it will show the language I selected before.

Above data is simulation only, I mainly focus on its features

All my current code

struct ContentView: View {
    
    var language: String? = ""
    
    var body: some View {
        NavigationView {
            HStack {
                NavigationLink(destination:LanguageView(language: language)) {
                    Text("Language")
                        .padding()
                    Spacer()
                    Text(language!)
                        .padding()
                }
            }
        }
    }
}


struct LanguageView: View {
    @Environment(\.presentationMode) var pres
    @State var language: String?
    @State var selectedLanguage: String? = ""
    
    var body: some View {

        VStack {
            CustomLanguageView(selectedLanguage: $language)
            
            Button(action: {
                language = selectedLanguage
                pres.wrappedValue.dismiss()
            })
            {
                Text("Save")
                    .foregroundColor(.black)
            }
            .padding()
            Spacer()
        }
    }
}
struct CustomLanguageView: View {
    var language = ["US", "English", "Mexico", "Canada"]
    @Binding var selectedLanguage: String?
    var body: some View {
        LazyVStack {
            ForEach(language, id: \.self) { item in
                SelectionCell(language: item, selectedLanguage: self.$selectedLanguage)
                    .padding(.trailing,40)
                Rectangle().fill(Color.gray)
                    .frame( height: 1,alignment: .bottom)
            }
            .frame(height:15)
        }
    }
}

struct SelectionCell: View {
    let language: String
    @Binding var selectedLanguage: String?
    
    var body: some View {
        HStack {
            Text(language)
            Spacer()
            if language == selectedLanguage {
                Image(systemName: "checkmark")
                    .resizable()
                    .frame(width:20, height: 15)
            }
        }
        .onTapGesture {
            self.selectedLanguage = self.language
        }
    }
}

CodePudding user response:

Edit to my previous answer, since something is blocking my edit to my previous answer, this one shows all the code I used to make it works well for me:

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    @State var language: String? = ""
    
    var body: some View {
        NavigationView {
            HStack {
                NavigationLink(destination: LanguageView(language: $language)) {
                    Text("Language").padding()
                    Spacer()
                    Text(language!).padding()
                }
            }
        }
    }
}

struct LanguageView: View {
    @Environment(\.presentationMode) var pres
    @Binding var language: String?
 
    var body: some View {
        VStack {
            CustomLanguageView(selectedLanguage: $language) // <--- here
            Button(action: { pres.wrappedValue.dismiss() }) {  // <--- here
                Text("Save").foregroundColor(.black)
            }.padding()
            Spacer()
        }
    }
}

struct CustomLanguageView: View {
    var language = ["US", "English", "Mexico", "Canada"]
    @Binding var selectedLanguage: String?
    var body: some View {
        LazyVStack {
            ForEach(language, id: \.self) { item in
                SelectionCell(language: item, selectedLanguage: self.$selectedLanguage).padding(.trailing,40)
                Rectangle().fill(Color.gray).frame( height: 1,alignment: .bottom)
            }.frame(height:15)
        }
    }
}

struct SelectionCell: View {
    let language: String
    @Binding var selectedLanguage: String?
    
    var body: some View {
        HStack {
            Text(language)
            Spacer()
            if language == selectedLanguage {
                Image(systemName: "checkmark").resizable().frame(width:20, height: 15)
            }
        }
        .onTapGesture {
            self.selectedLanguage = self.language
        }
    }
}

CodePudding user response:

you could use @State var language throughout and use dismiss, such as this, to achieve what you want:

struct LanguageView: View {
    @Environment(\.dismiss) var dismiss  // <--- here
    @Binding var language: String?
 
    var body: some View {
        VStack {
            CustomLanguageView(selectedLanguage: $language) // <--- here
            
            Button(action: {
                dismiss()   // <--- here
            })
            {
                Text("Save").foregroundColor(.black)
            }
            .padding()
            Spacer()
        }
    }
}
  • Related