我有一个将 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) 我有一个带有倒计时功能的 iOS 14 小部件
Text(foo, style: .timer)
Run Code Online (Sandbox Code Playgroud)
当时间小于1分钟时,如何将文字颜色更改为红色?
我正在尝试构建一个更好的小部件,我希望每次电池状态或电量发生变化时都会刷新该小部件。我知道两者都需要添加通知。所以我的逻辑是,当有关电池状态的通知发生变化时,我想刷新时间线。
但是我无法理解将观察者放在 TimelineProvider 或 Widget 视图下的位置?
struct timeWidgetEntryView : View {
var entry: Provider.Entry
let NC = NotificationCenter.default
init(entry:Provider.Entry) {
self.entry = entry
}
func batteryLevelDidChange(_ notification: Notification) {
UIDevice.current.isBatteryMonitoringEnabled = true
var level = UIDevice.current.batteryLevel
level = level * 100
WidgetCenter.shared.reloadAllTimelines()
NSLog("Level changed / state changed")
}
var body: some View {
VStack {
Text(entry.date, style: .time).foregroundColor(.black).frame(minWidth: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealWidth: 100, maxWidth: 100, minHeight: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealHeight: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxHeight: 50, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
Text("Battery : \(entry.batteryState)").foregroundColor(.black).frame(minWidth: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealWidth: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxWidth: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/, minHeight: …Run Code Online (Sandbox Code Playgroud) 我正在创建一个小部件,它有一个从日期开始倒计时的文本字段,如下所示:
Text(endDate, style: .relative)
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是作为其相对值,一旦达到零,当 endDate 成为过去时,它将继续重新计数。
有没有办法在文本为零时终止文本?或者我必须用计时器重建这个功能吗?
我需要做的就是从开始日期到结束日期倒计时,然后使文本字段无效或显示一条消息。
我有这样的看法
import SwiftUI
struct CurrentOrderView: View {
let order: CurrentOrder
var body: some View {
VStack(alignment: .leading, spacing: 4) {
HStack {
Text("Order:")
Text(order.orderId)
}
HStack {
Image(uiImage: deliveryImage)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 50.0, height: 50.0)
Text(order.formattedDeliveryTimeString)
}
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
.padding()
.background(LinearGradient(gradient: Gradient(colors: [.orange, .yellow]), startPoint: .top, endPoint: .bottom))
}
}
// MARK: - Private
private extension CurrentOrderView {
private var deliveryImage: UIImage {
switch order.status {
case .driverOnTheWayToRestaurant:
return UIImage(named: …Run Code Online (Sandbox Code Playgroud) 我向我的项目添加了一个意图扩展目标,我试图区分在编辑模式下显示的小部件类型,IntentHandler并根据此信息,我想用小、中或大小部件类型填充“编辑小部件”列表。
当我使用@Environment(\.widgetFamily) var family它时,它给了我.systemMedium所有的时间,但当时我正在编辑一个大尺寸的小部件。
对于前;当我长按一个小部件来编辑并从列表中选择另一个部件类型时,我看到一个包含小型、中型和大型部件类型的项目列表,IntentHandler但我只想看到小型类型。
问题是,是否可以根据我当前正在编辑的小部件类型来填充列表?
我有一个带有小部件的 SwiftUI 应用程序,在催化剂版本中都可以正常工作,或者直接为 macOS 编译小部件,但是当我将其添加到 macOS 目标(不是催化剂)时,出现以下错误
/Users/franciscomisaellanderoychante/proyects/Revisits/Revisits.xcodeproj Building for macOS, but the embedded app extension 'revisitsWidgetExtension.appex' is building for iOS. You may need to configure 'revisitsWidgetExtension.appex' to build for macOS.
但正如您所看到的,这些小部件实际上也是针对 macOS 的
在 macOS 中我选择了这个
我想做的是将现有的小部件与 macOS 应用程序一起使用
知道发生了什么吗?
当设备锁定时,我似乎无法让我的手表 WidgetKit 复杂化显示。这是在天气复杂功能中完成的,如果您摘下手表并将其放下,就可以看到它,但我的小部件在解锁之前会被编辑。
我尝试添加.unredacted到我的根小部件视图,但行为相同。这是我可以通过应用程序代码执行的操作还是仅由用户控制?我不记得将其设置为天气并发症,所以我认为它将自己设置为公开,这就是我想做的。文档中尚不清楚如何实现这一点。
我想将一个变量从我的 UIKit 文件共享到我用 SwiftUI 创建的小部件扩展。 我跟着这个here。请看看 J Arango 的回答。
但我不明白那里的最后一部分。我必须使用import MySharedObjects.
所以我这样做了:
import MySharedObject
struct testing {
let mySharedObject = MySharedObject(name: "My Name", lastName: "My Last Name")
do {
let data = try JSONEncoder().encode(mySharedObject)
/// Make sure to use your "App Group" container suite name when saving and retrieving the object from UserDefaults
let container = UserDefaults(suiteName:"group.com.widgetTest.widgetContainer")
container?.setValue(data, forKey: "sharedObject")
/// Used to let the widget extension to reload the timeline
WidgetCenter.shared.reloadAllTimelines()
} catch {
print("Unable to …Run Code Online (Sandbox Code Playgroud)