【问题标题】:How to fire `onAppear` method when a view comes back from `App Settings` changing a notifications setting?当视图从“应用程序设置”返回更改通知设置时如何触发“onAppear”方法?
【发布时间】:2020-12-20 17:29:49
【问题描述】:

我目前正在使用 SwiftUI 开发应用程序。

我正在尝试使用Local Notification 制作应用。

我想在App Settings 中反映一组Allow Notifications 的一些观点。

但是当使用我附加的导航链接(不是返回按钮)从App Settings 返回视图时,onAppear 方法不会触发,我无法显示收集值...

在我的代码中:

  • 1.点击Open Settings 导航到App Setting
  • 2.更改通知设置
  • 3.点击NotificationTest按钮
  • 4.回到ContentView 然后onAppear 方法不会触发

我该如何解决这个问题?


代码如下:

ContentView.swift

import SwiftUI

struct ContentView: View {
    
    @State var isNotification = false
    
    var body: some View {
        VStack{
            Text(isNotification ? "STATUS:ON" : "STATUS:OFF")
                .padding()
            Text("Open Settings")
                .padding()
                .onTapGesture {
                    UIApplication.shared.open(URL(string:UIApplication.openSettingsURLString)!)
                }
        }
        .onAppear(){
            confirmNotification()
        }
    }
    
    func confirmNotification(){
        UNUserNotificationCenter.current()
            .requestAuthorization(options: [.alert, .badge, .sound]){
                success, error in
                if success{
                    isNotification = true
                    print("Notification set")
                }else{
                    isNotification = false
                }
            }
    }
}

NotificationTestApp.swift

import SwiftUI

@main
struct NotificationTestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Xcode:版本 12.0.1

iOS:14.0

生命周期:SwiftUI 应用

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    视图已经出现,只是应用程序在后台。尝试改用(或另外)scenePhase

    struct ContentView: View {
        
        @Environment(\.scenePhase) private var scenePhase
        @State var isNotification = false
        
        var body: some View {
            VStack{
                Text(isNotification ? "STATUS:ON" : "STATUS:OFF")
                    .padding()
                Text("Open Settings")
                    .padding()
                    .onTapGesture {
                        UIApplication.shared.open(URL(string:UIApplication.openSettingsURLString)!)
                    }
            }
            .onAppear(){
                confirmNotification()
            }
            .onChange(of: scenePhase) { phase in
                switch phase {
                    case .active:
                        confirmNotification()
                    default:
                        break
                }
            }
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 2023-04-02
      • 2012-04-28
      相关资源
      最近更新 更多