【发布时间】:2021-06-13 09:30:46
【问题描述】:
我正在尝试向我的 SwiftUI 应用程序添加超时功能。达到超时时应更新视图。我在另一个 thread 上找到了代码,它适用于超时部分,但我无法更新视图。
我在 UIApplication 扩展中使用静态属性来切换超时标志。看起来当这个静态属性发生变化时视图没有得到通知。这样做的正确方法是什么?
已添加说明:
@workingdog 在下面提出了一个答案。这并不完全奏效,因为在实际应用程序中,不仅有一个视图,还有多个用户可以在它们之间导航的视图。所以,我正在寻找一个全局计时器,无论当前视图是什么,它都会被任何触摸动作重置。
在示例代码中,全局计时器工作,但当静态变量 UIApplication.timeout 更改为 true 时,视图不会注意到。
如何让视图更新?有没有比静态变量更适合这个目的的东西?或者计时器不应该在 UIApplication 扩展中开始?
这是我的代码:
import SwiftUI
@main
struct TimeoutApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onAppear(perform: UIApplication.shared.addTapGestureRecognizer)
}
}
}
extension UIApplication {
private static var timerToDetectInactivity: Timer?
static var timeout = false
func addTapGestureRecognizer() {
guard let window = windows.first else { return }
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapped))
tapGesture.requiresExclusiveTouchType = false
tapGesture.cancelsTouchesInView = false
tapGesture.delegate = self
window.addGestureRecognizer(tapGesture)
}
private func resetTimer() {
let showScreenSaverInSeconds: TimeInterval = 5
if let timerToDetectInactivity = UIApplication.timerToDetectInactivity {
timerToDetectInactivity.invalidate()
}
UIApplication.timerToDetectInactivity = Timer.scheduledTimer(
timeInterval: showScreenSaverInSeconds,
target: self,
selector: #selector(timeout),
userInfo: nil,
repeats: false
)
}
@objc func timeout() {
print("Timeout")
Self.timeout = true
}
@objc func tapped(_ sender: UITapGestureRecognizer) {
if !Self.timeout {
print("Tapped")
self.resetTimer()
}
}
}
extension UIApplication: UIGestureRecognizerDelegate {
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text(UIApplication.timeout ? "TimeOut" : "Hello World!")
.padding()
Button("Print to Console") {
print(UIApplication.timeout ? "Timeout reached, why is view not updated?" : "Hello World!")
}
}
}
}
【问题讨论】:
标签: ios swift swiftui uiapplication