Я нахожусь в процессе создания приложения Swift и пытаюсь понять, как отображать оповещения. У меня есть отдельный файл swift, который выполняет некоторые вычисления, и при определенных условиях я хочу, чтобы он отображал предупреждение для пользователя, в основном сообщая им, что что-то не так. Однако в большинстве примеров, которые я видел, требуется, чтобы оповещение находилось внутри ContentView
или каким-либо иным образом было связано с представлением, и я не могу понять, как отобразить оповещение из отдельного файла вне каких-либо представлений.
Большинство примеров, которые я видел, выглядят примерно так:
struct ContentView: View {
@State private var showingAlert = false
var body: some View {
Button("Show Alert") {
showingAlert = true
}
.alert("Important message", isPresented: $showingAlert) {
Button("OK", role: .cancel) { }
}
}}
В документации говорится, что всегда нужно объявлять @State
как приватное, как тогда я могу получить доступ или установить его из другого класса или файла?
Используйте модель представления ObservableObject вместо State и управляйте оповещениями через свойство в модели представления извне. Дальше должно быть полезно stackoverflow.com/a/64596846/12299030.
Если я правильно понимаю ваш вопрос, вы хотите показать alert
в пользовательском интерфейсе, когда в ваших расчетах возникает какое-то условие.
Когда вычисления происходят где-то еще в вашем коде, например, задача, контролирующая датчик.
Здесь я представляю подход с использованием NotificationCenter
, как показано в примере кода. Когда и где бы вы ни находились в своем коде, отправьте NotificationCenter.default.post...
, как в примере кода, и появится всплывающее предупреждение.
class SomeClass {
static let showAlertMsg = Notification.Name("ALERT_MSG")
init() {
doCalculations() // simulate showing the alert in 2 secs
}
func doCalculations() {
//.... do calculations
// then send a message to show the alert in the Views "listening" for it
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
NotificationCenter.default.post(name: SomeClass.showAlertMsg, object: nil)
}
}
}
struct ContentView: View {
let calc = SomeClass() // for testing, does not have to be in this View
@State private var showingAlert = false
var body: some View {
Text("calculating...")
.alert("Important message", isPresented: $showingAlert) {
Button("OK", role: .cancel) { }
}
// when receiving the msg from "outside"
.onReceive(NotificationCenter.default.publisher(for: SomeClass.showAlertMsg)) { msg in
self.showingAlert = true // simply change the state of the View
}
}
}
Это сделало почти то, что я искал! Однако это происходит в приложении AR с использованием RealityKit, и после отображения предупреждения изображение с камеры из приложения сильно искажено, даже после отклонения предупреждения. Вы знаете, почему это может происходить?
рад, что ответил хотя бы на часть вашего вопроса. Извините, но у меня нет опыта работы с приложением AR с использованием RealityKit. Я предлагаю вам опубликовать свой код проблемы и задать другой вопрос.
.alert
— модификатор вида. Из документов: «... Поскольку SwiftUI является декларативной структурой, вы не вызываете метод в тот момент, когда хотите представить модальное окно. Скорее, вы определяете, как выглядит презентация и условие, при котором SwiftUI должен ее представить. Затем SwiftUI определяет, когда условие изменяется, и создает для вас презентацию...". Таким образом, из «вне» представления просто измените условие, чтобы представить предупреждение.