Как представить оповещения/листы всего приложения поверх существующих листов в SwiftUI (центральный презентатор, такой кIOS

Программируем под IOS
Ответить
Anonymous
 Как представить оповещения/листы всего приложения поверх существующих листов в SwiftUI (центральный презентатор, такой к

Сообщение Anonymous »

TL;DR В моем приложении есть несколько глобальных оповещений и модальных окон (например, подсказки об ограничениях пробной версии, экран покупки в приложении и т. д.), которые должны быть доступны во всем приложении. В UIKit я всегда мог отображать оповещения или модальные окна на самом верхнем контроллере представления, независимо от того, что было представлено в данный момент. В SwiftUI, .

Код: Выделить всё

alert и .sheet
привязаны к локальной иерархии представлений, поэтому запуск оповещения изнутри листа сначала закрывает лист.
Существует ли собственный шаблон SwiftUI для представления глобальных оповещений/листов/модальных окон поверх всего — без моста UIKit и без перестройки пользовательских интерфейсов оповещений?

Вопрос
Я ищу способ в SwiftUI отображать оповещения или таблицы для всего приложения, независимо от того, где в настоящее время находится пользователь в иерархии представлений.
В UIKit это было просто: я просто поднялся по цепочке PresentViewController и вызвал Present(...) на самом верхнем контроллере представления.
В SwiftUI этот подход не транслируется, потому что .alert и .sheet и т. д. относятся к видимой в данный момент иерархии представлений.

Код: Выделить всё

class AppController: ObservableObject {
@Published var isShowingAlert = false
@Published var isShowingSheet = false
@Published var isShowingMsg = false

func showAlert() { isShowingAlert = true }
func showSheet() { isShowingSheet = true }
func showMsg() { isShowingMsg = true }
}

struct RootView: View {
@StateObject var appController = AppController()

var body: some View {
VStack {
Button("Show Alert") { appController.showAlert() }
Button("Show Sheet") { appController.showSheet() }
Button("Show Msg") { appController.showMsg() }
}
.alert("Title", isPresented: $appController.isShowingAlert) { }
.sheet(isPresented: $appController.isShowingSheet) {
SubViewA(appController: appController)
}

// additional modal
.sheet(isPresented: $appController.isShowingMsg) {
Text("Message")
}
}
}

struct SubViewA: View {
@ObservedObject var appController: AppController

var body: some View {
VStack {
Text("SubViewA")

// Will dissmiss SubViewA-Sheet and show alert on RootView
Button("Show Alert") { appController.showAlert() }

// Fails
Button("Show Msg") { appController.showMsg() }
}
}
}
Проблема: Если предупреждение срабатывает внутри представленного листа (

Код: Выделить всё

SubViewA
), SwiftUI сначала закрывает .sheet и только потом показывает предупреждение. Поэтому я не могу отображать «глобальное» оповещение поверх существующего файла .sheet. Отображение другого .sheet (или .fullscreenCover) поверх существующего листа также не удается.
То, что я ищу
Чистое решение SwiftUI, которое:
  • нет возврата к UIKit
  • позволяет глобальное представление предупреждений/листа
  • показывает их над представленными в настоящее время листами
  • не полагается на UIKit (UIViewController, Present(...))
  • не требует полностью настраиваемых реализаций предупреждений
Другими словами:
Существует ли рекомендуемый SwiftUI-native шаблон для глобального, независимого от иерархии модального представления? Или это просто невозможно с текущей системой представления SwiftUI?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ui-central
Ответить

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

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

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

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

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