SwiftUIでは TabView
を使ってページビューを作成できますが、多量のページを表示したい場合に負荷的な問題がないのか、ライフサイクルを観察してみました。
以下のコードを動かしてみます。
import SwiftUI
struct ContentView: View {
var body: some View {
TabView {
ForEach((1..<100)) { id in
Page(id: id)
}
}
.tabViewStyle(.page)
}
private struct Page: View {
let id: Int
init(id: Int) {
self.id = id
print("Instantiate: \(id)")
}
var body: some View {
print("Render: \(id)")
return Text("Page\(id)")
.onAppear { print("Appear: \(id)") }
.onDisappear { print("Disappear: \(id)") }
}
}
}
アプリ起動後、以下のログが出力されました。
Instantiate: 1
Instantiate: 2
Instantiate: 3
...
Instantiate: 99
Instantiate: 1
Render: 1
Appear: 1
この後次のページへの切り替えを行なっていくと、
Instantiate: 2
Render: 2
Appear: 2
Instantiate: 3
Render: 3
Appear: 3
Disappear: 1
Disappear: 2
...
と出力されました。
推察するに、
-
TabView
の ViewBuilder でページ数分のPage
がインスタンス化される
(ページ数計上のため?そしてレンダリングは行わない) - 実際に表示するページごとに
Page
をインスタンス化、表示のためレンダリング
という挙動になっているようです。
SwiftUIのViewは何度もインスタンス化されるものなので、 init
に高負荷な処理を入れない限りは問題なさそうです!