首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI超时警报,然后超时

SwiftUI超时警报,然后超时
EN

Stack Overflow用户
提问于 2022-02-08 23:03:13
回答 1查看 354关注 0票数 0

我设置了一个计时器来显示两个警报。第一个警报显示给用户一个警告:“嘿,您已经不活动了一段时间了,您还在这里吗?”如果他们点击“是”,它就会重置计时器。如果他们不点击警报按钮,在x时间之后,它会显示第二个警报通知他们的会话已经过期。他们点击OK,然后将它们从导航视图中移出并返回到主页。

这一切都工作得很好,但是XCode抛出的错误是:

代码语言:javascript
复制
[Presentation] Attempt to present <SwiftUI.PlatformAlertController: 0x7fc2fa031800> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x7fc2e9f05530> (from <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_24NavigationColumnModifier__: 0x7fc309f28e80>) which is already presenting <SwiftUI.PlatformAlertController: 0x7fc2ea842000>.

据我所知,这是说,已经有一个警告正在显示,即使我要驳回它,显示你的另一个警告,我会抱怨它,这告诉我我做错了什么。我想确保我做的是正确的,这样我就不会在XCode的控制台中收到这个错误。

在创建定时器之后,我将使用onReceive来查看它:

代码语言:javascript
复制
.onReceive(timer) { time in
            if userTimeout == true {
                timer.upstream.connect().cancel()
            } else {
            caWarning()
            caTimeout()
            }
        }

这两个函数实际上很简单:

代码语言:javascript
复制
func caWarning() {
    if Date.now >= userActivity.addingTimeInterval(5*1) {
        userActivityAlert = true
    }
}

func caTimeout() {
    if Date.now >= userActivity.addingTimeInterval(10*1) {
        userActivityAlert = false
        userTimeout = true
    }
}

最后,警报的if语句是:

代码语言:javascript
复制
if userActivityAlert == true {
            VStack {
                EmptyView()
            }
            .alert("Foo", isPresented: $userActivityAlert, actions: {
                Button("I'm Here") {
                    userActivity = Date.now
                }
            }, message: { Text("Are you still there?") }
        ) // End show alert
        } else if UserTimeout == true {
            VStack {
                EmptyView()
            }
            .alert("Foo", isPresented: $userTimeout, actions: {
                Button("OK") {
                    self.caRegExpired.navToHome = true
                }
            }, message: {
                    Text("Your session has expired.\nTap OK, to start over.")
            }) // End Alert
        } // End If

我已经试过了我能想到的一切。从@Environment (\.dismiss) var dismiss,然后打电话给dismiss() (不理会潜在的视图而不是警告),大量浏览苹果的文档和旧的UIKit文档(没有帮助)。

我可以这样做(即两个单独的警报),或者能够在一段时间后将第一个警报修改为第二个警报(甚至可以在用户会话过期之前显示倒计时)。

老实说,我想知道这是否只是日志噪音,因为第一个警报消失了,第二个警报显示得恰如其分。从字面上看,这一切都很好,但重要的是,错误得到了解决,我想知道我是否做错了什么。

这是最新的SwiftUI 5+和XCode for iOS 15+

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-09 07:17:52

@loremipsum的链接有一个答案:在禁用第一个警报和显示第二个警报之间稍等片刻:

代码语言:javascript
复制
struct ContentView: View {
    
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
    @State private var userActivityAlert = false
    @State private var userTimeout = false
    @State private var userActivity = Date.now
    
    var body: some View {
        
        VStack {
            Text("Hello, World!")
                .alert("Foo", isPresented: $userActivityAlert, actions: {
                    Button("I'm Here") {
                        userActivity = Date.now
                    }
                }, message: { Text("Are you still there?") }
                ) // End show alert
            
            Text("Hello, World!")
                .alert("Foo", isPresented: $userTimeout, actions: {
                    Button("OK") {
                        //                        self.caRegExpired.navToHome = true
                    }
                }, message: {
                    Text("Your session has expired.\nTap OK, to start over.")
                }) // End Alert
            
        }
        .onReceive(timer) { time in
            if userTimeout == true {
                timer.upstream.connect().cancel()
            } else {
                caWarning()
                caTimeout()
            }
        }
    }
    
    func caWarning() {
        if Date.now >= userActivity.addingTimeInterval(5*1) {
            userActivityAlert = true
        }
    }
    
    func caTimeout() {
        if Date.now >= userActivity.addingTimeInterval(10*1) {
            userActivityAlert = false
            
            //This delay leaves a little gap between alerts
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                userTimeout = true
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71042003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档