前提・実現したいこと
Swift UIについての質問です。
いまmainのところでバックグラウンド、フォアグラウンドを検知できることは
わかったのですが、この情報を他のビュー(次に遷移するビューではない)に渡すには
どういう方法をとればよいのでしょうか?
次に遷移するビューではないので@bindingや@EnvironmentObjectではうまくいかずどうすべきかわからず悩んでいます。
(無理矢理グローバル変数を使っていますが、うまくいっていません、、)
実装したい機能としてはバックグラウンドの前の時間情報を保存して、
バックグラウンド中の時間経過も測れるタイマーを作りたいと思っています。
発生している問題・エラーメッセージ
timerが二重起動してしまう。
バックグラウンド中の時間が計算されていない。
該当のソースコード
var timeCounter = 300
var timer = Timer()
@main
struct PIcPIckApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate //@Environment(.scenePhase) private var scenePhase //@ObservedObject var shareData: ShareData @Environment(.scenePhase) private var scenePhase @State var isBackground = false @State var date1 = Date() @State var date2 = Date() var body: some Scene { WindowGroup { ContentView().environmentObject(ShareData()) }.onChange(of: scenePhase) { phase in if phase == .background { self.isBackground = true //shareData.timerStop() print("バックグラウンド!") } if phase == .active { self.isBackground = false timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true){_ in timeCounter -= 1 } RunLoop.current.add(timer ?? Timer(), forMode: .common) print("フォアグラウンド!") } if phase == .inactive{ if isBackground{//バックグラウンドからフォアグラウンドに切り替わる時 self.date2 = Date() timeCounter -= Int(date2.timeIntervalSince(date1)) timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true){_ in timeCounter -= 1 } RunLoop.current.add(timer ?? Timer(), forMode: .common) }else{//フォアグラウンドからバックグラウンドに切り替わる時 self.date1 = Date() //shareData.timerStop() timer.invalidate() } print("バックグラウンドorフォアグラウンド直前") } } }
}
試したこと
実際にタイマーの時間を表示しているviewにバックグラウンド検知の.onChangeを書く
→そうするとそのviewが起動するたびにタイマーが重複して起動してしまう。
3日くらい格闘しているのですがもうなにをすればいいのかわからず、
助けてほしいです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー