Перенаправление на лист или презентацию при касании локального уведомления в swiftui, ios14

#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, который опубликован. Не знаю, я пропустил это простое решение.