我想要进行一次现代语言更改,但我不知道如何重新启动应用程序,或者更确切地说,我知道,但对我来说,它的工作有一个错误,而不是我想要的方式.在其他应用程序中,我看到语言在不离开应用程序的情况下更新,滑块只是旋转,就是这样,语言被替换了.如何在SwiftUI中实现这一点?

下面是我运行应用程序的方式:

import SwiftUI

@main
 struct MyApp_UkraineApp: App {
    @StateObject var appSettings = AppSettings()

    var body: some Scene {
        WindowGroup {
            MainMenuView()
                .environmentObject(appSettings)
        }
    }
}

这就是我改变语言的方式:

import SwiftUI

struct MainMenuView: View {
    
    @EnvironmentObject private var appSettings: AppSettings
        
    var body: some View {
                HStack {
                    Button("Ukraine") {
                        Language.selected = .ukraine
                        resetApp()
                    }
                    Button("English") {
                        Language.selected = .english
                        resetApp()
                    }
                }
    
    func resetApp() {
        if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
            if let windowSceneDelegate = scene.delegate as? UIWindowSceneDelegate {
                windowSceneDelegate.window??.rootViewController = UIHostingController(rootView: MainMenuView())
                }
            }
        }
    }
}

enum Language: String, CaseIterable {
    case english, ukraine

    var code: String {
        switch self {
        case .english: return "en"
        case .ukraine: return "uk"
        }
    }

    static var selected: Language {
        set {
            UserDefaults.standard.set([newValue.code], forKey: "AppleLanguages")
            UserDefaults.standard.set(newValue.rawValue, forKey: "language")
        }
        get {
            return Language(rawValue: UserDefaults.standard.string(forKey: "language") ?? "") ?? .english
        }
    }

    static func switchLanguageBetweenEnglishAndGerman() {
        selected = selected == .english ? .ukraine : .english
    }
}

我收到这个错误,我知道它为什么会出现,但我不知道如何修复它:

线程1:致命错误:找不到AppSetting类型的ObservableObject.可能缺少作为此视图的上级的AppSetting的View.Environmental对象(_:).

但主要的问题是,如何确保在不重新启动应用程序的情况下进行现代语言更新?

推荐答案

你可以把environment(\.locale, ...)放在你的应用程序的根部来设置语言.

不过,环境不能直接设置,因此您需要将设置存储在某个地方(在@ObservableObservableObject中).

@Observable
class LanguageSetting {
    // initialise this from UserDefaults if you like
    var locale = Locale(identifier: "en")
}
// in your App conformance
@State var languageSettings = LanguageSetting()

var body: some Scene {
    WindowGroup {
        ContentView()
            .environment(languageSettings)
            .environment(\.locale, languageSettings.locale)
    }
}

当您想要更改语言时:

@Environment(LanguageSetting.self) var languageSettings

var body: some View {
    Button("Chinese Simplified") {
        // code to update user defaults omitted...

        languageSettings.locale = Locale(identifier: "zh-Hans")
    }
}

有关如何使用ObservableObject实现这一点,请参阅Observation migration guide.

Ios相关问答推荐

StackView UIKit间距似乎非常小的编程式编程

无法在fastlane和github操作中从react-native 应用程序构建ios

构建iOS项目失败.我们运行了";xcodeBuild";命令,但它退出并返回错误代码65-expo reaction ative

SWIFT设备方向更新不正确

Swift-如何通过Case Let访问模型变量

SwiftData共享扩展阻止应用程序打开SQLite文件

如何删除点击时按钮的不透明动画?

如何结合`@dynamicMemberLookup`和`ExpressibleByStringInterpolation`来实现方法链?

NSOperation 有延迟 - 它是异步的还是同步的?

如何让替换视图淡入旧视图而不是交叉淡入淡出?

弹出视图后使所有背景 UI 模糊

如何将标准化坐标系中的点的位置转换为具有相对位置的常规坐标系?

将图像保存到 Documents 目录并检索邮箱附件

如何忽略touch 事件并将它们传递给另一个子视图的 UIControl 对象?

Swift tableView 分页

如何在 Objective-C (iOS) 中的图像上写文本?

在 NSUserDefaults 中存储值是否有任何限制?

在 iOS 7 中更改返回按钮会禁用滑动导航返回

Info.plist 实用程序错误:无法打开 Info.plist,因为没有这样的文件

将 struct 保存到 UserDefaults