【Swift】変数を共有したい(macos)
2023-06-14
どうも、氷翠です。
作業をしていると引き数で値を処理に回すのとは別に、変数を共有する方がすんなり表示するデータとして使えたりする。だんたんとそんな場面に遭遇するようになってきた。そこで、今回はデータを共有する方法があったので、勉強してみました。
まずはメインの画面を作成。
struct ContentView: View {
// テキストフィールドに利用する変数
// のちに子ウインドウと共有する変数にもなる
@State var testVariable : String = "あいうえお"
// Sheetとして子ウインドウを表示するかどうかのフラグとなる変数
@State private var showingModal = false
var body: some View {
VStack {
TextField("テスト入力", text: $testVariable)
.padding()
// 子ウインドウが表示されたとき確認ができるように
// 広くとっておく
.frame(width: 600)
Button("別入力") {
// ボタンが押されたときにフラグを変更させる
self.showingModal.toggle()
}
// sheetとして、showingModalがtrueのときに表示させる
.sheet(isPresented: $showingModal) {
// 子ウインドウを呼び出す
// 子ウインドウには共有する変数を入れる
inputDialog(testVariable: $testVariable)
// ↑の共有する変数は、self.ではなく、$にしておく
}
}
.padding()
}
}
ここではいつも通りの作成となる。ただ、共有する変数名「testVariable」を自分の中に記憶しておく。
struct inputDialog: View {
// 環境変数のたぐいで、この変数を利用して閉じるときの処理
@Environment(\.presentationMode) private var presentationMode
// 共有する変数と同じ変数名で@Bindingという宣言で定義する
@Binding var testVariable : String
var body: some View {
VStack {
TextField("テスト", text: $testVariable)
.frame(width: 300)
Button("閉じる") {
// 環境変数を利用してこのウインドウを閉じる
self.presentationMode.wrappedValue.dismiss()
}
}
}
}
// プレビューはエラーになるので削除する
/*
struct inputDialog_Previews: PreviewProvider {
static var previews: some View {
inputDialog()
}
}
*/
今回のプログラムの中には新たに「@Environment」という環境変数を利用している。この環境変数を使ってこのウインドウを閉じる動作をするわけだ。
問題なのはその次の行。「@Binding」の後ろに親ウインドウで共有させる変数名と同じ変数名をいれておく。そしてこれを引き数にしておく。親ウインドウからこのビューを呼び出すとき「inputDialog(testVariable: $testVariable)」となるが、ここでは変数は「$」をつける。「self」ではない。
これでこの変数を共有することができる。
これが親ウインドウ。これだけ。これで下にあるボタンを押すと。
このようにダイアログが出てくる。そして、親ウインドウにある文字列がここに表示されている。
この文字列を変更すると、親ウインドウの文字が変わっていく。
こんな感じで共有することができました。
コメントを残す