0

当我使用我的 EnviromentObject 时,我遇到了 Picker 选择问题。我的环境对象是用户设置,用户在其中保存偏好,如语言、货币等。我在 contentview 中添加了这个对象,作为环境对象,在 scenedelegate 中声明。UserSettings 结构有一个 Picker。我的目标是将所选设置语言显示为第一个选择器选择,但我有 2 个问题:1)第一个选择不起作用 2)当我选择选择器中的列表项时,视图会自动关闭到主视图。假设视图 A(主视图),视图 B 是选择器所在的视图,视图 C 是我点击我的选择器时的视图。当我点击模拟器时,模拟器会自动从 C--> B (ok) 和 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)
                            
                        }
                        
                    }
                  
                }
            }
    }
}

主屏幕,比如说主页

图片

选择器不显示首选语言(我确定环境对象已设置属性

图片

当我点击选择器时,我看到了列表并且没问题,但是当我选择一个项目时,模拟器会自动返回到屏幕截图 n°2 并在主屏幕 n°1 上 1 秒后

图片

4

1 回答 1

0

是的,使用 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 ://i.stack.imgur.com/A6Yov.png

于 2021-03-19T09:52:52.797 回答