回答編集履歴

1

説明修正

2023/02/16 13:18

投稿

TakeOne
TakeOne

スコア6299

test CHANGED
@@ -1,6 +1,6 @@
1
1
  提示された画面遷移元のコードは、Route型が定義されていなかったり、ContentViewを呼び出す時の引数が合っていなかったりするので、このままコピペしてアプリを実行して再現確認することはできませんでしたが、エラーを適当に修正してアプリを起動したところ、質問の動作が発生することを確認しました。
2
2
 
3
- 画面遷移元から単純に1つのContentViewに画面遷移するだけなら元のコードでも問題ないと思いますが、提示されたコードは、ForEachでNavigationLinkを複数生成しており、それぞれのNavigationLinkからContentViewに画面遷移するようになっています。この場合、画面遷移時に複数ContentViewが生成されることがあります。
3
+ 画面遷移元から単純に1つのContentViewに画面遷移するだけなら元のコードでも問題ないと思いますが、提示されたコードは、ForEachでNavigationLinkを複数生成しており、それぞれのNavigationLinkからContentViewに画面遷移するようになっています。この場合、画面遷移時に複数ContentViewが生成されることがあります。
4
4
 
5
5
  TobusDataViewModelのinitでタイマーを起動する箇所に `print("タイマー開始")` を入れて実行するとわかると思いますが、画面遷移した時に、複数個の「タイマー開始」がprint表示されることがわかると思います。つまり、画面遷移した時に、ContentViewが複数回生成されていて、TobusDataViewModelもそれに応じて複数生成されているため、そのinit処理でタイマーが複数個生成されているということです。そして、 `onDisappear` でタイマーを止めても、1個のタイマーしか止められていないため、他のタイマーは動作したままになります。
6
6