### 実現したいこと
Swift UIで画面遷移時にタイマーを停止したい。
前提
ソースコード TobusDataViewModelクラス内にTimer.scheduledTimer()で15秒おきに処理を繰り返すタイマーを設置しておりますが、メモリ解放のため、ContentViewが画面遷移で非表示になった際にタイマー(myTimer)の破棄をするプログラムを実装しております。
ContentView内のVStack()直下の.onDisappear()でTobusDataViewModelクラス内のmyTimerプロパティを呼び出し、invalidate()でタイマーの破棄を試みました。
発生している問題・エラーメッセージ
コンソールでタイマーが停止しているか、確認を行いましたが、タイマーが停止していない(処理が続いている)ことがわかりました。
該当のソースコード
Swift
1 2 3struct TopView: View{ 4 var routes: [Route] = routeData 5 var body: some View { 6 NavigationStack { 7 ScrollView { 8 LazyVGrid(columns: [GridItem()], spacing: 0.0) { 9 ForEach(0 ..< routes.count ,id: \.self) { index in 10 NavigationLink(value: index){ 11 Text(routes[index].title) 12 } 13 } 14 } 15 } 16 .navigationBarTitle(Text("ホーム"),displayMode: .inline) 17 .navigationDestination(for: Int.self) { value in 18 ContentView(id: routes[value].note, busroute: routes[value].busroute, buspole: routes[value].title, startpole1: routes[value].startpole1, startpole2: routes[value].startpole2) 19 } 20 } 21 } 22} 23 24struct ContentView: View { 25 @ObservedObject private var tobusDataVM = TobusDataViewModel() 26 var body: some View { 27 VStack() { 28 Text("text") 29 } 30 .onDisappear(perform:{ 31 self.tobusDataVM.myTimer.invalidate() 32 print("タイマー停止") 33 }) 34 .toolbar { 35 ToolbarItem(placement: .navigationBarTrailing) { 36 Button(action: { 37 self.tobusDataVM.myTimer.invalidate() 38 }, label: { 39 Text("タイマー停止") 40 }) 41 } 42 } 43 } 44 } 45 46class TobusDataViewModel: ObservableObject { 47 var myTimer: Timer! 48 init() { 49 myTimer = Timer.scheduledTimer(withTimeInterval:15, repeats: true, block: { (time:Timer) in 50 //処理 51 }) 52 } 53 //処理 54}
試したこと
onDisappear()内に print("タイマー停止") を記述し、画面遷移時にアクションが実行可能か、確認を行いましたところ、アクションは実行可能である事が分かりました。
しかしながら、該当のソースコードでは、タイマーの破棄が実行されません。
原因が分かる方がいらっしゃいましたら、ご教示いただけますと幸いです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー