问题描述
当我使用我的环境对象时,选择器选择有问题。我的环境对象是用户设置,用户在其中保存他们的偏好,如语言、货币等。我在 contentview 中添加了这个对象,作为环境对象,在scenedelegate 中声明。 UserSettings 结构有一个选择器。我的目标是将所选设置语言显示为首选选择器选项,但我有两个问题:1) 第一个选择不起作用 2) 当我选择选择器中的列表项时,视图会自动关闭到主视图。假设视图 A(主视图),视图 B 是选择器所在的视图,视图 C 是我点击选择器时的视图。当我点击模拟器时,模拟器会自动从 C-->B (ok) 和 B-->A 1 秒后。这是我的代码。任何建议将不胜感激。谢谢
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 并在 1 秒后在主屏幕 n °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://i.stack.imgur.com/A6Yov.png