SwiftUI:以编程方式关闭警报

Posted

技术标签:

【中文标题】SwiftUI:以编程方式关闭警报【英文标题】:SwiftUI: Dismiss Alert Programatically 【发布时间】:2020-11-05 12:28:27 【问题描述】:

如果位置服务关闭或被拒绝,我会弹出一个警报,将用户引导至“设置”,以便可以打开位置服务。它通过将状态变量 showAlert 设置为 true 来显示。我的代码是:

Alert(title: Text("Location Services"),
                     message: Text("Location Services is off or denied. The app must have your location to function. Please enable Location Services for the app in Settings."),
                     primaryButton: .default(Text("Settings"), action: 
                        self.showAlert = false // my attempt to clear the alert
                        UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
                     ),
                     secondaryButton: .default(Text("Okay")))

我遇到的问题是,当用户单击设置按钮转到设置以打开定位服务时,警报不会消失。因此,当用户启用后返回应用程序时 他们,警报仍然存在,说明服务未开启。这是一种糟糕的用户体验,我希望在用户返回之前将其关闭。从代码中可以看出,我尝试将 showAlert 状态变量设置为 false,但这不起作用。有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为这是由于应用程序变得不活跃,所以丢失了事件。试试下面的

 primaryButton: .default(Text("Settings"), action: 
    // delay action a bit, to give chance to close alert
    DispatchQueue.main.async 
       UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
    
 ),

【讨论】:

谢谢!那成功了!我玩了延迟时间并将其一直降低到现在 + 0.01,它工作正常,没有明显的延迟。半秒感觉界面卡住了,以后有人用这个。 @Yrb,那么值得一试DispatchQueue.main.async ... 也可以。那将值得编辑解决方案。节省几个周期,代码更干净。【参考方案2】:

尝试使用这个开源:https://github.com/huynguyencong/ToastSwiftUI。我发现它非常好用。

它适用于 Swift 5.0 或更高版本、ios 13 或更高版本

struct ContentView: View 
@State private var isShowingToast = false

var body: some View 
    VStack(spacing: 20) 
        Button("Show toast") 
            self.isShowingToast = true
        
        
        Spacer()
    
    .padding()

    // Just add a modifier to show a toast, with binding variable to control
    .toast(isPresenting: $isShowingToast, dismissType: .after(3)) 
        ToastView(message: "Hello world!", icon: .info)
    

【讨论】:

欢迎来到 Stack Overflow。我不确定是否有充分的理由使用第三方包,当本地构建的工作完美而轻松时。而且你知道你在处理什么线程。

以上是关于SwiftUI:以编程方式关闭警报的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:以编程方式关闭工作表

以编程方式一个接一个地关闭 SwiftUI 视图不起作用

如何在 Swiftui 上关闭应用程序时创建警报(不是通知)

SwiftUI 和 macOS:如何检测关闭的最后一个窗口并显示应用程序将退出的警报

SwiftUI 基于计算属性显示警报

如何使用 SwiftUI 连续呈现两个警报视图