Выбор средства выбора из свойства EnviromentObject

У меня проблема с выбором средства выбора, когда я использую свой объект EnviromentObject. Мой объект среды - это UserSettings, где пользователи сохраняют свои предпочтения, такие как язык, валюта и так далее. Я добавил этот объект в contentview как объект enviroment, объявленный в scenedelegate. В структуре UserSettings есть средство выбора. Моя цель - показать в качестве первого выбора выбранный язык настроек, но у меня есть 2 проблемы: 1) первый выбор не работает 2) когда я выбираю элемент списка в средстве выбора, представление автоматически закрывается до основного представления. Скажем, представление A (основное представление), представление B - это представление, в котором находится средство выбора, представление C - это представление, когда я нажимаю на средство выбора. Когда я нажимаю, симулятор автоматически переходит из C -> B (хорошо), а через 1 секунду - из B -> A. Это мой код. Любые предложения будут оценены. Спасибо

      class UserSettings : ObservableObject  {
    @Published var linguaCode = ""
    @Published var lingua = ""
    @Published var formatoData = ""
    @Published var formatoValuta = ""
    
    init(){
        
        let linguaChoosed = UserDefaults.standard.string(forKey: "lingua")
        if( linguaChoosed == nil || linguaChoosed!.isEmpty ){
            self._linguaCode =  .init(initialValue: String(Locale.preferredLanguages[0].prefix(2)))
        }
        else{
            self._linguaCode = .init(initialValue: String(linguaChoosed!))
        }
        
        let formatoDataChoosed = UserDefaults.standard.string(forKey: "data")
        if(formatoDataChoosed == nil || formatoDataChoosed!.isEmpty){
            self._formatoData = .init(initialValue: String(GlobalCostants.Data.data_formato_dd_mm_yyyy))
        }
        else {
            self._formatoData = .init(initialValue: String(formatoDataChoosed!))
        }
        
        let valutaChoosed = UserDefaults.standard.string(forKey: "valuta")
        if(valutaChoosed == nil || valutaChoosed!.isEmpty){
            self._formatoValuta = .init(initialValue: String(GlobalCostants.Valuta.valuta_euro_nome))
        }
        else {
            self._formatoValuta = .init(initialValue: String(valutaChoosed!))
        }
        self._lingua = .init(initialValue: getLanguageFromCode(languageCode: linguaCode))
    }
    
    func setLanguageCode(languageCode: String) {
        linguaCode = languageCode
    }
    
    func setCurrency(currencyCode: String) {
        formatoValuta = currencyCode
    }
    func setData(dataFormat: String) {
        formatoData = dataFormat
    }
    func getLanguageFromCode(languageCode: String) -> String {
        switch languageCode {
        case EnumLingua.italiano.rawValue:
            return GlobalCostants.Lingua.lingua_italiano
        case EnumLingua.inglese.rawValue:
            return GlobalCostants.Lingua.lingua_inglese
        default:
            return ""
        }
    }
    
   }

это моя структура:

      import Foundation
import SwiftUI

struct prova: View {
    @EnvironmentObject var userSettings : UserSettings


    @State private var listaLingue: [String] = ["italiano","inglese"]

    var body: some View {
       
            Form{
                VStack{
                    
                    Picker(selection: $userSettings.lingua, label: Text(LocalizedStringKey("lingua"))){
                        ForEach(0 ..< listaLingue.count, id: \.self){
                            index in
                            Text(LocalizedStringKey(listaLingue[index])).tag(index)
                            
                        }
                        
                    }
                  
                }
            }
    }
}

Главный экран, скажем, домашняя страница

Средство выбора не показывает предпочтительный язык (я уверен, что у объекта enviroment установлено свойство

Когда я нажимаю на средство выбора, я вижу список и все в порядке, но когда я выбираю один элемент, симулятор автоматически возвращается к снимку экрана № 2 и через 1 секунду на главном экране № 1

1 ответ

Да, использование String в качестве тега вместо Int позволяет видеть элементы в сборщике, но вторая проблема все еще остается. Когда я открываю средство выбора и выбираю один элемент, скажем, на английском языке, средство выбора возвращается, и через 1 секунду мое представление возвращается в основное представление. Я не могу понять почему ..

Я тоже изменил код сборщика:

                          Picker(selection: $userSettings.lingua, label: Text(LocalizedStringKey("lingua"))){
                    ForEach(0 ..< listaLingue.count, id: \.self){
                        index in
                        Text(LocalizedStringKey(listaLingue[index])).tag(listaLingue[index])
                        
                    }
                    
                }

Круто, теперь я вижу элементы выбора [1]: https://stackru.com/images/1df61f22a0f017c49904977f6ee708938fd9c210.png

Другие вопросы по тегам