Avatar
onAppear で create して onDisappear で release したいようなものってどうやって保持するのがいいですか?
2:23 PM
import SwiftUI struct ContentView: View { var body: some View { NavigationView { FirstView() } } } struct FirstView: View { var body: some View { return NavigationLink(destination: SecondView()) { Text("Go") } .onAppear { // ここで create } .onDisappear { // ここで release } } } struct SecondView: View { var body: some View { Text("Second") } }
2:26 PM
FirstView のプロパティに Box 的なクラスのインスタンスを保持しておいて、 onAppear で create されたインスタンスを Box に格納して、その Box を介して onDisappear で release ?
2:26 PM
もし FirstView がコンポーネント的な View で、親 Viewbody が頻繁に再実行されたときにうまく動くか心配。
2:32 PM
struct FirstView: View { var box = Box<Foo>() var body: some View { NavigationLink(destination: SecondView()) { Text("Go") } .onAppear { self.box.value = Foo() } .onDisappear { self.box.value?.release() self.box.value = nil } } } みたいな。 (edited)
2:35 PM
やっぱり↓にしたらちゃんと動かなくなった。 struct ContentView: View { @State var count: Int = 0 var body: some View { NavigationView { VStack { Stepper(count.description, value: $count) .frame(maxWidth: 160) FirstView() } } } } Stepper の値を増減させる度に body が再実行されて FirstViewbox が再生成されるから。
2:40 PM
box の代わりに struct FirstView: View { // var box = Box<Foo>() @State var foo: Foo? として保持させる裏技もあるけど、 @State のようなライフサイクルがほしいだけで、変更検知(して body 再実行)はいらない・・・。
2:41 PM
変更検知なしの @State みたいな Property Wrapper を作ればいいのかな・・・。