Я использую таймер в просмотре, чтобы показывать время. В методах onAppear () и onDisappear () View таймер работает хорошо.
Но когда я закрываю окно, кажется, что метод onDisappear () не вызывается, и таймер никогда не останавливается.
Вот мой тестовый код:
import SwiftUI
struct TimerTest: View {
@State var date = Date()
@State var showSubView = false
@State var timer: Timer?
var body: some View {
ZStack{
if showSubView {
VStack {
Text(" Timer Stoped?")
Button("Back") {
self.showSubView = false
}
}
}
else {
VStack {
Button("Switch to subview"){
self.showSubView = true
}
Text("date: \(date)")
.onAppear(perform: {
self.timer = Timer.scheduledTimer(withTimeInterval: 1,
repeats: true,
block: {_ in
self.date = Date()
NSLog("?onAppear timer triggered")
})
})
.onDisappear(perform: {
self.timer?.invalidate()
self.timer = nil
NSLog("? onDisappear stop timer")
// But if I close window, this method never be called
})
}
}
}
.frame(width: 500, height: 300)
}
}
Итак, как мне правильно остановить таймер после закрытия окна?
И как View может быть уведомлен, когда окно будет закрыто, стремитесь освободить некоторые ресурсы в экземпляре View.
(Я придумал хитрый метод, используя TimerPublisher, заменив Timer, который будет автоматически останавливаться после закрытия окна. Но это не решает моей путаницы.)