どうも、ちょげ(@chogetarou)です。
SwiftUIで画面遷移をする際に値を渡す方法を2つ紹介します。
データバインディング

ひとつは、「データバインディングを使う」方法です。
遷移先の画面に@Bindingを付与した変数を用意しておきます。
そして、遷移先のビューに先頭に$をつけた状態変数を渡します。
struct SampleView: View {
@State var onSwitch = false
@State var text = "hello"
var body: some View {
if onSwitch {
HelloView(text : $text)
} else {
Button(action: {
self.onSwitch.toggle()
}, label: {
Text("遷移")
})
}
}
}
struct HelloView : View {
@Binding var text: String
var body: some View {
Text(text)
}
}
HelloViewに画面遷移する際に、状態変数textの値を渡すことができます。
システム

もうひとつは、SwiftUIのシステム自体にビューとは別で値を管理してもらう方法です。
SwiftUIのシステムに値を管理してもらうことでも、値を渡すことができます。
システムで値を管理するには、ObservableOjectを使います。
class Hello : ObservableObject {
@Published var text = ""
}
struct SampleView: View {
@ObservedObject var hello = Hello()
@State var onSwitch = false
@State var text = "hello"
var body: some View {
if onSwitch {
HelloView(hello: hello)
} else {
Button(action: {
self.hello.text = text
self.onSwitch.toggle()
}, label: {
Text("遷移")
})
}
}
}
struct HelloView : View {
@ObservedObject var hello :Hello
var body: some View {
Text(hello.text)
}
}
Observableクラスを使うことで、値の管理をビューとは別ですることができ、複数のビューで値を共有できるようになります。
具体的には、遷移前のビューでシステムに値を渡しておいて、遷移後のビューでその値を取り出せば値を渡しているようになります。
Observableの使い方については、「カピ通信」さんの記事がわかりやすいのでそちらを参考にしてみてください。

【SwiftUI】データバインディング
SwiftUIのデータバインディングの仕組みである@State、@ObservedObject、@EnvironmentObject各々の特徴について解説します。
まとめ
画面遷移で値を渡す方法は、2つです。
- @Binding変数を使う
- SwiftUIのシステムで値を管理させておく
コメント