自分用の時刻表アプリを作ろう、という記事を以前書いたのですが、
これに復路のViewを追加しよう、と思った時に、Viewの.onAppearに起動時に1回だけやる処理を記述していたことが問題になりました。Viewがひとつだけなら問題ないのですが、複数のViewを行ったり来たりする場合、Viewが表示されるたびに.onAppearが実行されてしまいます。
ということで、起動時に1回(だけやりたい/しかやってはいけない)処理はどこに書けばいいのか、調べてみました。
Xcodeでプロジェクトを作った時に(プロジェクト名)App.swiftなるファイルが作られたと思いますが、あれの中に書くのが正解のようです。
import SwiftUI
@main
struct MyProject1App: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
上のようになっているコードを以下のように変えます。
import SwiftUI
@main
struct MyProject1App: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate // この行を追加する
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
// 追加
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
// 起動時に1回だけやる処理をここに記述する
return true
}
}
以下の環境で、動作を確認しました。
MacOS Monterey 12.5.1
Xcode 13.4.1