SwiftUI 小部件中的 UIKit UserDefaults

Posted

技术标签:

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

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

谢谢!

【问题讨论】:

你需要创建一个应用组 是的,我有一个应用程序组,但实际访问数据的部分对我来说是个问题。我认为它不像在我的实际应用中定义 UserDefaults.standard 那样简单。不过还是谢谢。 见Share data between main App and Widget in SwiftUI for ios 14或Sharing Data with AppGroup 【参考方案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 包装器不会更新视图。该值将被读取一次但永远不会更新,因为小部件中的视图是静态的并且仅由提供者刷新。

以上是关于SwiftUI 小部件中的 UIKit UserDefaults的主要内容,如果未能解决你的问题,请参考以下文章

如何从小部件扩展导航到 UIKit viewController?

SwiftUI 中的小部件 UI 预览

如何知道 UIKit 视图控制器中的 swiftUI 事件? ||如何提供 swiftUI 和 uikit 之间的通信

如何使用yii2菜单小部件uikit设置数据属性

isPlaceholder 修饰符不可用且在小部件工具包 + SwiftUI 中不起作用

SwiftUI 小部件无法刷新