我有一个使用 Core Data + CloudKit 堆栈的应用程序。(核心数据在设备之间同步。)。现在我想在 iOS 14 小部件中显示来自 Core Data 的数据(在 WidgetKit 目标中查看)。
\n我的目标是让小部件中的数据也是来自核心数据的实际数据:即 \xe2\x80\x94 用户更改了设备 A 上的记录,稍后在设备 B(带有小部件)上更改了小部件中表示的记录。
\n我应该怎么做:
\na)为主应用程序目标和小部件目标添加应用程序组功能;并在小部件目标中获取核心数据。
\nb) 在主应用程序目标中获取核心数据,保存到文件(plist?、JSON?),然后在小部件中使用该文件。
\nc)在主应用程序目标中获取核心数据,从小部件目标中获取该数据。(是否可以?)
什么才是最合理的方式呢?感谢您的任何建议。
\n我有两个简单的观点:
import SwiftUI
struct ContentView: View {
@State private var showingModalView = false
var body: some View {
Button(action: {
self.showingModalView.toggle()
}) {
Text("Show Modal View")
}.sheet(isPresented: $showingModalView) {
ModalView()
}
}
}
struct ModalView: View {
var body: some View {
Text("Modal View")
}
}
Run Code Online (Sandbox Code Playgroud)
当“显示模态”按钮按下时,ModalView
显示。
如何在活动时将文本“取消”更改ModalView
为其他内容?
我有一个使用 Core Data 和 CloudKit 的应用程序。更改在设备之间同步。主要目标有后台模式功能,检查Remote notifications
iCloud 功能,服务设置为 CloudKit,并检查容器中的正确容器。
我如何在代码中对记录的更改、删除和添加做出反应?我需要WidgetCenter.shared.reloadAllTimelines()
在 CloudKit 中的核心数据更改以更新 iOS 14 主屏幕小部件时调用。
我的目标是让这个工作:我在 icloud.developer.apple.com 或其他设备上更改/添加/删除记录,并WidgetCenter.shared.reloadAllTimelines()
调用以在小部件中显示正确的数据。应用程序可能在后台或前台。
来自AppDelegate.swift
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Register for Remote Notifications
application.registerForRemoteNotifications()
return true
}
Run Code Online (Sandbox Code Playgroud)
此外,在输出日志中注意到消息:
CoreData: debug: CoreData+CloudKit: -[NSCloudKitMirroringDelegate remoteStoreDidChange:]_block_invoke(2138): <NSCloudKitMirroringDelegate: 0x281818d00> - 忽略远程更改通知,因为导出器已经赶上了这个事务:64 / 64 - <NSCloudKitMirroringDelegate: 0x281818d00>网址:file:///var/mobile/Containers/Data/Application/F83C68DA-7C36-42CC-926D-7C721C679579/Library/Application%20Support/AppTitle.sqlite)
我有一个将 Core Data 与 CloudKit 结合使用的应用程序。更改在设备之间同步。主要目标具有后台模式功能,并带有选中的远程通知。主目标和小部件目标都具有相同的应用程序组,并且都具有 iCloud 功能,服务设置为 CloudKit,并且检查了容器中的相同容器。
我的目标是在 SwiftUI WidgetKit 视图中显示实际的核心数据条目。
我的小部件目标文件:
import WidgetKit
import SwiftUI
import CoreData
// MARK: For Core Data
public extension URL {
/// Returns a URL for the given app group and database pointing to the sqlite database.
static func storeURL(for appGroup: String, databaseName: String) -> URL {
guard let fileContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup) else {
fatalError("Shared file container could not be created.")
}
return fileContainer.appendingPathComponent("\(databaseName).sqlite")
}
}
var managedObjectContext: NSManagedObjectContext …
Run Code Online (Sandbox Code Playgroud)