質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%

Q&A

解決済

1回答

3695閲覧

画面遷移時に値渡しをする方法

ioli

総合スコア12

0グッド

0クリップ

投稿2021/06/29 06:53

編集2021/06/30 07:39

#やりたいこと
ContentViewとSecondViewの二つがある。
ContentViewには3つのボタンが配置してある。
どれかのボタンを押すと、sheetが出現して押されたボタンが何番目のボタンかを表示する。

#問題点
SecondViewに画面遷移する際にForEachで定義したnを渡したいのですが、どのように書いたらよいのかが分かりません。

SwiftUI

1struct ContentView: View { 2 @State var objects = ["●","●","●"] 3 @State var ShowFlag = [false,false,false] 4 5 var body: some View { 6 ForEach(0..<self.objects.count, id: .self){ n in 7 Button(action: { 8 self.ShowFlag[n].toggle() 9 }) { 10 Text(number[n]) 11 .sheet(isPresented: self.$ShowFlag[n]){ 12 SecondView(//ここが分かりません) 13 } 14 } 15 } 16 } 17}

SwiftUI

1struct SecondView: View { 2 @Binding var num : Int 3 var body: some View { 4 Text("(num)") 5 } 6}

初歩的な内容の質問ですが、どうかご教授いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この場合は SecondView 側で num を定義して,ただの値渡しでよいです。
SecondView 側で num を変更して ContentView 側に知らせる必要がある場合は @Binding 必要です。

swift

1struct SecondView: View { 2 // @Binding var num : Int 3 let num : Int 4 var body: some View { 5 Text("(num)") 6 } 7}

swift

1struct ContentView: View { 2 @State var objects = ["●","●","●"] 3 @State var ShowFlag = [false,false,false] 4 5 var body: some View { 6 ForEach(0..<self.objects.count, id: .self){ n in 7 Button(action: { 8 self.ShowFlag[n].toggle() 9 }) { 10 Text(number[n]) 11 .sheet(isPresented: self.$ShowFlag[n]){ 12 // SecondView(//ここが分かりません) 13 SecondView(num: n) 14 } 15 } 16 } 17 } 18}

ShowFlag も Array にする必要はなく Bool で十分そうです。(この時点では少なくとも)

投稿2021/06/30 15:32

TakuyaAso

総合スコア1361

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ioli

2021/06/30 22:46

そういうことなんですね! 値渡しする際はBindingをしないといけないと思っていたので、勘違いしていたことがわかりました。本当にありがとうございます! また、もう一つアドバイスいただいたShowFlagについてですが、Boolにしてみたところどのボタンを押しても0が表示されてしまいました。Boolでこれを再現するためには何か一工夫する必要があるのですか?なるべく配列は使いたくなく、Boolでできるならそちらで実装したいなと思いご質問させていただきました。 重ねての質問失礼致します。
TakuyaAso

2021/06/30 23:12

動作確認してなかったです,すみません。 selectedNum 的な選択時のIntを代入可能にするために変数定義しておいて, Button タップ時に代入するようにしてその値を値渡しするのがわかりやすいかなと思いました。 ShowFlag はあくまでもモーダル表示したか,していないかのフラグとして考えるのがスッキリしそうですー struct ContentView: View { @State var objects = ["●","●","●"] @State var ShowFlag = false @State private var selectedNum: Int = 0 // 選択時のIntを代入するために定義 var body: some View { ForEach(0..<self.objects.count, id: .self){ n in Button(action: { self.ShowFlag.toggle() self.selectedNum = n // ボタンタップ時に代入 }) { Text(n.description) } .sheet(isPresented: $ShowFlag){ // SecondView(//ここが分かりません) SecondView(num: selectedNum) // 選択した値を渡す } } } }
ioli

2021/07/01 01:10 編集

変数を作って、そこに代入する必要があったんですね! 何度も教えていただきありがとうございます。TakuyaAsoさんのおかげで前よりもすっきりしたコードが書けそうです!
TakuyaAso

2021/07/01 18:44

良かったです!お互い頑張りましょう!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問