#swift #xcode #ios14
#swift #xcode #ios14
Вопрос:
У меня есть небольшое приложение, похожее на system Alarm. При срабатывании будильника появляется уведомление, и при прикосновении к нему предполагается, что пользователь переходит к определенному виду (модальный, полный вид, на самом деле не имеет значения). Прикосновение к уведомлению работает, но оно возвращает пользователя только в приложение, а не в конкретное представление. Весь пользовательский интерфейс находится в SwiftUI, однако я не знаю, как изменить состояние «срабатывающей» переменной, которая должна открывать полноэкранный режим при значении true.
Код:
NotifcationCenter:
class NotificationCenter: NSObject, ObservableObject {
@Published var isTouched: Bool = false
override init() {
super.init()
UNUserNotificationCenter.current().delegate = self
}
}
extension NotificationCenter: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { }
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
isTouched = true
}
func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { }}
AlarmView:
struct AlarmView: View {
// MARK: - PROPERTIES
@State var isAlarmOn: Bool = true
@State var editAlarmSheet: Bool = false
@EnvironmentObject var alarmVM: AlarmVM
@StateObject var localNotification = LocalNotification()
@State var triggered: Bool = false
@ObservedObject var notificationCenter: NotificationCenter
// MARK: - BODY
var body: some View {
NavigationView {
List {
ForEach(alarmVM.alarms, id:.id) { alarm in
AlarmItem(alarm: alarm)
} // FOREACH
.onDelete(perform: { indexSet in
removeRow(at: indexSet)
})
} // LIST
.padding(.top, 40)
.navigationTitle("Alarms")
.navigationBarItems(trailing: Button( action: {
editAlarmSheet.toggle()
} ) {
Image(systemName: "plus")
}) // BUTTON
.sheet(isPresented: $editAlarmSheet, content: {
EditAlarmSheet().environmentObject(alarmVM)
}) // SHEET
} // NAVIGATION VIEW
.fullScreenCover(isPresented: $triggered, content: FullScreenModalView.init)
.onAppear(perform: {
localNotification.sendNotification()
triggered = notificationCenter.isTouched
})
.navigationViewStyle(StackNavigationViewStyle())
} // VIEW
Я просто установил состояние «срабатывает» равным «NotificationCenter.isTouched» в .onAppear (), но я думаю, что это слишком наивно и просто не работает.
Любая помощь будет высоко оценена.
Ответ №1:
Я исправил это, было действительно просто. Вместо использования @State для представления полноэкранного режима я использую NotificationCenter.isTouch, который опубликован. Не знаю, я пропустил это простое решение.