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?
如何知道 UIKit 视图控制器中的 swiftUI 事件? ||如何提供 swiftUI 和 uikit 之间的通信