Avatar
ツイッターのこの会話が発端の話題なんですが https://twitter.com/omochimetaru/status/1652273418958675969
@kntkymt @treastrain @fummicc1 ContentViewAって、 ContentViewBのように書いてるのと(ほぼ)同じって理解であってますか?
12:36 AM
// 素早くトグルすれば値が生きている struct ContentViewE: View { @State var toggle = false var body: some View { if toggle { VStack { TextView() Button { toggle.toggle() } label: { Text("toggle if") } } } else { VStack { TextView() Button { toggle.toggle() } label: { Text("toggle if") } } } } } final class ViewModel: ObservableObject { @Published var count = 0 } struct TextView: View { @StateObject var viewModel: ViewModel init() { _viewModel = .init(wrappedValue: ViewModel()) } var body: some View { Button { viewModel.count += 1 } label: { Text("count: \(viewModel.count)") } } }
🙇‍♂️ 1
12:36 AM
↑このように、 if 文の then側とelse側にそれぞれViewを置いて、その中にStateObjectをもたせた時、
12:37 AM
素早く then → else → then と戻ってくると、過去のthenの値が記憶されているが (StateObjectがdeinitされない)
12:37 AM
ゆっくり then → else → then と戻ってくると、値がリセットされる (StateObjectが deinit & init される)
12:37 AM
という現象に遭遇したんですが、これってSwiftUIのバグですか? それとも、SwiftUI的に何か説明されてる現象ですか?
12:38 AM
↓素早く操作すると値が残っている現象の動画です (edited)
12:38 AM
ちなみに、このように書き換えると、値が残る現象が消える事もわかりました。 // 必ずリセットされる struct ContentViewD: View { @State var toggle = false var body: some View { VStack { if toggle { TextView() } else { TextView() } Button { toggle.toggle() } label: { Text("toggle if") } } } }