【问题标题】:UIKit UserDefaults in SwiftUI widgetSwiftUI 小部件中的 UIKit UserDefaults
【发布时间】:2020-09-26 15:08:31
【问题描述】:

希望是一个简单的问题,但我想知道如何从 SwiftUI 小部件访问保存在我的 UIKit 应用程序中的 UserDefaults 数据?我需要在小部件中显示其中的一些数据。

谢谢!

【问题讨论】:

标签: swift swiftui widget uikit ios14


【解决方案1】:

您需要使用 UserDefaults(suiteName:) 而不是 UserDefaults.standard 以及 AppGroup。 UserDefaults.standard 只能在它所在的应用程序中访问,它不适用于您可能制作的任何扩展程序或其他应用程序。这就是您必须使用 AppGroup 的原因。

创建 AppGroup 后(您可以在“签名和功能”部分执行此操作),您应该有一个 suiteName 用于它,例如:

group.com.my.app.identifier

然后在应用程序的 UIKit 部分中,您可以通过以下方式设置 AppGroup 的 UserDefaults 中的值:

if let userDefaults = UserDefaults(suiteName: "group.com.my.app.identifier") {
    userDefaults.setValue("value to save", forKey: "Key")
}

然后你可以使用:

if let userDefaults = UserDefaults(suiteName: "group.com.my.app.identifier") {
    let value = userDefaults.string(forKey: "Key")
}

由于 Widget 将使用 SwiftUI 编写,因此您可以使用属性包装器 @AppStorage 来访问值:

@AppStorage("Key", store: UserDefaults(suiteName: "group.com.my.app.identifier"))
var value: String = ""

如果您已经将希望使用的值存储在 UserDefaults.standard 中,则需要将它们复制到 UserDefaults(suitName:)

【讨论】:

  • 非常感谢!同样,可能很简单,但我想确定它是正确的,我如何将值从 UserDefaults.standard 传输到套件? :)
  • 没有直接的方法可以做到这一点。最简单的解决方案是只保存需要在套件中独占共享的所有值。如果您有标准值,那么您将不得不复制它们(可能在应用程序启动时)。我知道复制的唯一方法是从标准读取并保存在套件中。您还应确保更新多个地方所需的任何默认值以使用该套件,这样您就不必再次执行复制操作。
  • 请记住@AppStorage 包装器不会更新视图。该值将被读取一次但永远不会更新,因为小部件中的视图是静态的并且仅由提供者刷新。
猜你喜欢
  • 2019-12-05
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2019-11-11
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多