Виджет WidgetKit SwiftUI не отображает контент должным образом на главном экранеIOS

Программируем под IOS
Ответить
Anonymous
 Виджет WidgetKit SwiftUI не отображает контент должным образом на главном экране

Сообщение Anonymous »


Я работаю над виджетом SwiftUI, используя WidgetKit, и столкнулся с проблемой, из-за которой содержимое виджета некорректно отображается на главном экране. Содержимое виджета отображается в виде цветных прямоугольников вместо ожидаемого текста и элементов. Однако предварительный просмотр в SwiftUI Canvas работает отлично.

Вот мой код виджета:

импортировать WidgetKit импортировать SwiftUI импорт намерений //МАРК: - Создание провайдера для предоставления данных для виджета Поставщик структуры: TimelineProvider { typealias Entry = WidgetEntry ///Заполнитель для отображения статических данных пользователю заполнитель func (в контексте: Context) -> WidgetEntry { WidgetEntry(дата: Дата(), topThreeMovies: [dummyMovie, dummyMovie, dummyMovie]) } ///Снимок для использования предварительного просмотра при добавлении виджетов func getSnapshot(в контексте: Контекст, завершение: @escaping (WidgetEntry) -> ()) { /// Виджет исходного снимка или типа загрузки пусть запись = WidgetEntry(дата: Дата(), topThreeMovies: [dummyMovie, dummyMovie, dummyMovie]) завершение (запись) } /// Эта функция обновляет виджет для событий func getTimeline(в контексте: Контекст, завершение: @escaping (Timeline) -> ()) { пусть MovieListViewModel = MovieListViewModel() // Получение трех лучших фильмов с использованием модели представления MovieListViewModel.fetchTopThreeMovies { topThreeMovies в /// Инициализация пустого массива для записей WidgetEntry записи var: [WidgetEntry] = [] ///Установим значение для currentDate пусть текущаяДата = Дата() /// Указываем данные для входа пусть запись = WidgetEntry(дата: Дата(), topThreeMovies:topThreeMovies ) /// Обновляем виджет каждые 15 минут пусть обновитьВремя = Calendar.current.date(byAdding: .минута, значение: 1, to: currentDate) записи.append(запись) /// Создание временной шкалы let timeline = Timeline(записи: записи, политика: .after(refreshTime!)) завершение (сроки) } } } // ОТМЕТКА: - Просмотр записи виджета «Лучшие фильмы» структура TopMoviesWidgetEntryView: Просмотр { запись переменной: Provider.Entry /// Доступ к переменной среды семейства виджетов @Environment(\.widgetFamily) семейство переменных @ViewBuilder var body: some View { /// Переключение на основе семейства виджетов переключить семейство { случай .systemMedium: /// Отображение MovieWidgetView для виджета среднего размера MovieWidgetView(topThreeMovies: [dummyMovie, dummyMovie, dummyMovie]) по умолчанию: /// Обработка других типов семейства виджетов (здесь для простоты используется fatalError) FatalError("Неподдерживаемое семейство виджетов") } } } // ОТМЕТКА: - Конфигурация виджета структура TopMoviesWidget: Виджет { /// Уникальный идентификатор виджета let kind: String = "TopMoviesWidget" var body: some WidgetConfiguration { StaticConfiguration(вид: вид, поставщик: Provider()) {запись в TopMoviesWidgetEntryView (запись: запись) } .configurationDisplayName("Виджет лучших фильмов") .description("Это виджет списка лучших фильмов сегодняшнего дня.") .supportedFamilies([.systemMedium]) } } // ОТМЕТКА: - Создать предварительный просмотр для представления записи виджета. структура TopMoviesWidget_Previews: PreviewProvider { статические предварительные просмотры var: some View { TopMoviesWidgetEntryView(запись: WidgetEntry(дата: Дата(), topThreeMovies: [dummyMovie, dummyMovie, dummyMovie])) .previewContext(WidgetPreviewContext(семейство: .systemMedium)) } } Вот мой код для виджета:

импортировать SwiftUI импортировать WidgetKit /// Виджет лучших фильмов структура MovieWidgetView: Посмотреть { // @StateObject var viewModel = MovieListViewModel() var topThreeMovies: [Фильм] var body: some View { HStack(выравнивание: .top) { /// Показать день недели, дату и кнопку списка VStack(выравнивание: .leading) { ///День недели Text("\(Date().getFormattedWeekDay())") .foregroundColor(.оранжевый) .смелый() ///Дата Текст("\(Дата().getFormattedDate())") .смелый() Разделитель() ///Кнопка списка для перехода к экрану списка фильмов Кнопка (действие: { /// Закрываем вид виджета и переходим к MovieListView }) { Label("", systemImage: "list.bullet.circle.fill").body .foregroundColor(.оранжевый) .font(.system(размер: 30)) } } .padding(EdgeInsets(верхнее: 20, ведущее: 0, нижнее: 0, завершающее: 10)) Разделитель() ///Три лучших фильма Listr VStack(выравнивание: .leading) { ForEach(0.. Void) { isLoading = правда ///получим три лучших фильма из всех фильмов для меня в 0.. Int? { return Movies.firstIndex { $0.id == movie.id } } Снимок виджета с фиктивными данными:


Изображение


Виджет на главном экране:


Изображение

Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»