在iOS 14的SwiftUI主应用程序和小部件之间共享数据

在iOS 14的SwiftUI主应用程序和小部件之间共享数据,swift,swiftui,widget,ios14,widgetkit,Swift,Swiftui,Widget,Ios14,Widgetkit,如何从我的主应用程序获取数据到小部件?您可以为您的小部件和应用程序添加AppGroup功能(这是如何添加它的一个很好的解释) 用户默认值 而不是 @main struct ClockWidgetExt: Widget { private let kind: String = "ClockWidgetExt" public var body: some WidgetConfiguration { StaticConfiguration

如何从我的主应用程序获取数据到小部件?

您可以为您的小部件和应用程序添加AppGroup功能(这是如何添加它的一个很好的解释)


用户默认值 而不是

@main
struct ClockWidgetExt: Widget {
    private let kind: String = "ClockWidgetExt"
    
    public var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider(), placeholder: PlaceholderView()) { entry in
            HomeTestView()
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}
只需为您的应用程序组使用共享的
UserDefaults

UserDefaults.standard
然后,您可以使用共享文件容器,如本答案中所述:

核心数据 您还可以创建共享CoreData容器:

let someFileURL = containerURL.appendingPathComponent("SomeFile.txt")
然后,您可以使用共享的CoreData容器,如本答案中所述:



下面是一个包含不同小部件示例的示例,其中包括应用程序组小部件。

您可以为您的小部件和应用程序添加AppGroup功能(这是如何添加它的一个很好的说明)


用户默认值 而不是

@main
struct ClockWidgetExt: Widget {
    private let kind: String = "ClockWidgetExt"
    
    public var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider(), placeholder: PlaceholderView()) { entry in
            HomeTestView()
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}
只需为您的应用程序组使用共享的
UserDefaults

UserDefaults.standard
然后,您可以使用共享文件容器,如本答案中所述:

核心数据 您还可以创建共享CoreData容器:

let someFileURL = containerURL.appendingPathComponent("SomeFile.txt")
然后,您可以使用共享的CoreData容器,如本答案中所述:



下面是一个不同的小部件示例,包括应用程序组小部件。

一个简单的方法是将应用程序和小部件添加到同一个应用程序组,然后从位于该应用程序组容器中的UserDefaults存储(而不是应用程序的默认UserDefaults存储)存储和检索数据。 您可以通过使用初始化UserDefaults来访问应用程序组的此共享存储

let storeURL = containerURL.appendingPathComponent("DataModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)

let container = NSPersistentContainer(name: "DataModel")
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { ... }
而不是使用
UserDefaults.standard


提供此过程详细信息的更全面描述。

一种简单的方法是将应用程序和小部件添加到同一应用程序组,然后从位于该应用程序组容器中的UserDefaults存储(而不是应用程序的默认UserDefaults存储)存储和检索数据。 您可以通过使用初始化UserDefaults来访问应用程序组的此共享存储

let storeURL = containerURL.appendingPathComponent("DataModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)

let container = NSPersistentContainer(name: "DataModel")
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { ... }
而不是使用
UserDefaults.standard


对该过程的详细信息进行了更全面的描述。

您能告诉我将代码(共享CoreData容器)放在哪里吗。如果可以,请共享一段代码片段,其中显示了小部件中的获取部分。@umayanga这里实际上没有小部件特定的内容。创建持久容器的方式与在标准应用程序中相同(只需显式指定sqlite文件的位置)。这同样适用于提取部分。您可以从持久容器访问上下文,并使用它执行提取请求。但由于这可能仍然令人困惑,我在你的帖子下面添加了一个更详细的解释。你能告诉我把代码(共享CoreData容器)放在哪里吗。如果可以,请共享一段代码片段,其中显示了小部件中的获取部分。@umayanga这里实际上没有小部件特定的内容。创建持久容器的方式与在标准应用程序中相同(只需显式指定sqlite文件的位置)。这同样适用于提取部分。您可以从持久容器访问上下文,并使用它执行提取请求。但由于这可能仍然令人困惑,我在你的帖子下面添加了一个更详细的解释。