我设置了一个计时器来显示两个警报。第一个警报显示给用户一个警告:“嘿,您已经不活动了一段时间了,您还在这里吗?”如果他们点击“是”,它就会重置计时器。如果他们不点击警报按钮,在x时间之后,它会显示第二个警报通知他们的会话已经过期。他们点击OK,然后将它们从导航视图中移出并返回到主页。
这一切都工作得很好,但是XCode抛出的错误是:
[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来查看它:
.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
userTimeout = true
}
}最后,警报的if语句是:
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+
发布于 2022-02-09 07:17:52
@loremipsum的链接有一个答案:在禁用第一个警报和显示第二个警报之间稍等片刻:
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
}
}
}
}https://stackoverflow.com/questions/71042003
复制相似问题