Любитель Swift... Не стесняйтесь указывать, насколько плох код.
Я пытаюсь создать приложение SwiftUI, и у меня есть модель SwiftData под названием Diem (обратный отсчет класс событий). Модель связана с DynamicAppIntent, поэтому пользователь должен иметь возможность выбрать один из обратных отсчетов в модели для отображения в виджете.
После долгих хлопот (выборка из модели SwiftData для DynamicAppIntent Виджет), мой запрос наконец-то перестал давать сбой. Однако представление виджета не обновляется с использованием выбранного AppIntent из SwiftData. Я думаю, проблема может быть в моем провайдере? Я до сих пор не до конца понимаю, как работает и обновляется таймлайн. Но это также может быть с моим WidgetConfigurationIntent/defaultQuery...
Полная версия проекта находится на GitHub. Некоторые выдержки ниже:
DiemEntityQuery.swift
struct DiemEntityQuery: EntityQuery, Sendable {
func entities(for identifiers: [DiemEntity.ID]) async throws -> [DiemEntity] {
logger.info("Loading diems for identifiers: \(identifiers)")
let container = try ModelContainer(for: Diem.self)
let modelContext = ModelContext(container)
let diems = try modelContext.fetch(FetchDescriptor(predicate: #Predicate { identifiers.contains($0.name) }))
// let diems = try modelContext.fetch(FetchDescriptor())
logger.info("Found \(diems.count) diems")
return diems.map { DiemEntity(from: $0) }
}
func suggestedEntities() async throws -> [DiemEntity] {
logger.info("Loading diems to suggest for specific diem...")
let container = try ModelContainer(for: Diem.self)
let modelContext = ModelContext(container)
let diems = try modelContext.fetch(FetchDescriptor())
logger.info("Found \(diems.count) diems")
return diems.map { DiemEntity(from: $0) }
}
}
DiemWidgetProvider.swift
private let logger = Logger(subsystem: "Widgets", category: "DiemTimelineProvider")
struct DiemWidgetProvider: AppIntentTimelineProvider {
let modelContext = ModelContext(try! ModelContainer(for: Diem.self)) // same issue as Intent
func placeholder(in context: Context) -> DiemWidgetEntry {
// let diem = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)])).first!
logger.info("Calling placeholder() in DiemWidgetProvider...")
return DiemWidgetEntry(date: .now, diem: .placeholder)
}
func snapshot(for configuration: DiemWidgetIntent, in context: Context) async -> DiemWidgetEntry {
let diems = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)]))
logger.info("Found \(diems.count) diems")
guard let diem = diems.first else {
return DiemWidgetEntry(date: .now, diem: .placeholder)
}
return DiemWidgetEntry(date: .now, diem: diem)
}
func timeline(for configuration: DiemWidgetIntent, in context: Context) async -> Timeline {
// TODO: update widget once per day
// Use the selected intent parameter to generate the timeline entry
if let diemEntity = configuration.diem {
logger.info("Found configuration diem: \(diemEntity.name)")
let diem = Diem(entity: diemEntity)
let entry = DiemWidgetEntry(date: .now, diem: diem)
let timeline = Timeline(entries: [entry], policy: .atEnd)
return timeline
} else {
// If no diem is selected, provide a placeholder or default entry
let diems = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)]))
logger.info("No diem selected. Providing placeholder to widget...")
logger.info("Found \(diems.count) diems")
guard let diem = diems.first else {
logger.info("Using placeholder diem as placeholder")
return Timeline(
entries: [DiemWidgetEntry(date: .now, diem: .placeholder)],
policy: .never
)
}
logger.info("Using first diem as placeholder...")
return Timeline(entries: [DiemWidgetEntry(date: .now, diem: diem)], policy: .atEnd)
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... -appintent
Виджет iOS не обновляется при выборе SwiftData AppIntent ⇐ IOS
Программируем под IOS
-
Anonymous
1728769872
Anonymous
Любитель Swift... Не стесняйтесь указывать, насколько плох код.
Я пытаюсь создать приложение SwiftUI, и у меня есть модель SwiftData под названием Diem (обратный отсчет класс событий). Модель связана с DynamicAppIntent, поэтому пользователь должен иметь возможность выбрать один из обратных отсчетов в модели для отображения в виджете.
После долгих хлопот (выборка из модели SwiftData для DynamicAppIntent Виджет), мой запрос наконец-то перестал давать сбой. Однако представление виджета не обновляется с использованием выбранного AppIntent из SwiftData. Я думаю, проблема может быть в моем провайдере? Я до сих пор не до конца понимаю, как работает и обновляется таймлайн. Но это также может быть с моим WidgetConfigurationIntent/defaultQuery...
Полная версия проекта находится на GitHub. Некоторые выдержки ниже:
DiemEntityQuery.swift
struct DiemEntityQuery: EntityQuery, Sendable {
func entities(for identifiers: [DiemEntity.ID]) async throws -> [DiemEntity] {
logger.info("Loading diems for identifiers: \(identifiers)")
let container = try ModelContainer(for: Diem.self)
let modelContext = ModelContext(container)
let diems = try modelContext.fetch(FetchDescriptor(predicate: #Predicate { identifiers.contains($0.name) }))
// let diems = try modelContext.fetch(FetchDescriptor())
logger.info("Found \(diems.count) diems")
return diems.map { DiemEntity(from: $0) }
}
func suggestedEntities() async throws -> [DiemEntity] {
logger.info("Loading diems to suggest for specific diem...")
let container = try ModelContainer(for: Diem.self)
let modelContext = ModelContext(container)
let diems = try modelContext.fetch(FetchDescriptor())
logger.info("Found \(diems.count) diems")
return diems.map { DiemEntity(from: $0) }
}
}
DiemWidgetProvider.swift
private let logger = Logger(subsystem: "Widgets", category: "DiemTimelineProvider")
struct DiemWidgetProvider: AppIntentTimelineProvider {
let modelContext = ModelContext(try! ModelContainer(for: Diem.self)) // same issue as Intent
func placeholder(in context: Context) -> DiemWidgetEntry {
// let diem = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)])).first!
logger.info("Calling placeholder() in DiemWidgetProvider...")
return DiemWidgetEntry(date: .now, diem: .placeholder)
}
func snapshot(for configuration: DiemWidgetIntent, in context: Context) async -> DiemWidgetEntry {
let diems = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)]))
logger.info("Found \(diems.count) diems")
guard let diem = diems.first else {
return DiemWidgetEntry(date: .now, diem: .placeholder)
}
return DiemWidgetEntry(date: .now, diem: diem)
}
func timeline(for configuration: DiemWidgetIntent, in context: Context) async -> Timeline {
// TODO: update widget once per day
// Use the selected intent parameter to generate the timeline entry
if let diemEntity = configuration.diem {
logger.info("Found configuration diem: \(diemEntity.name)")
let diem = Diem(entity: diemEntity)
let entry = DiemWidgetEntry(date: .now, diem: diem)
let timeline = Timeline(entries: [entry], policy: .atEnd)
return timeline
} else {
// If no diem is selected, provide a placeholder or default entry
let diems = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)]))
logger.info("No diem selected. Providing placeholder to widget...")
logger.info("Found \(diems.count) diems")
guard let diem = diems.first else {
logger.info("Using placeholder diem as placeholder")
return Timeline(
entries: [DiemWidgetEntry(date: .now, diem: .placeholder)],
policy: .never
)
}
logger.info("Using first diem as placeholder...")
return Timeline(entries: [DiemWidgetEntry(date: .now, diem: diem)], policy: .atEnd)
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79075542/ios-widget-not-updating-when-selecting-swiftdata-appintent[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия