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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1375閲覧

SwiftUI ボタンのアクションを別ビューで出したい

shokotaso

総合スコア1

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/10/01 16:23

編集2021/10/01 16:26

やりたいこと:
HomeViewにあるテキストボックス風ボタンを押すとpartialsheetが出て、ビュー内のボタン(複数ある)を押すとそれに応じたテキストがテキストボックス風の場所に表示される

partialsheet内でボタンに応じたテキストを出すことはできるのですが、HomeViewに表示させるやり方がわかりません。教えていただけると助かります

[Xcode] 12.5.1
[MacOS] Big Sur 11.5.2

import SwiftUI
import PartialSheet

struct HomeView: View {

@State var showPartial = false var body: some View { Button (action: { showPartial.toggle() }){ Text(" ") .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) .border(Color.gray) } .partialSheet(isPresented: $showPartial) { PartialSheetView() } }

}

struct PartialSheetView: View {

@State var action = "" @EnvironmentObject var partialSheetManager: PartialSheetManager var body: some View { VStack(spacing: 10){ Text("") .padding(.top,200) Button(action:{ action = "フォールド" }){ Text("フォールド") .font(.body) .bold() .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) .border(Color.gray) } Button(action:{ action = "チェック" }){ Text("チェック") .font(.body) .bold() .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) .border(Color.gray) } Button(action:{ action = "ストラドル" }){ Text("ストラドル") .font(.body) .bold() .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) .border(Color.gray) } Button(action:{ action = "ベット" }){ Text("ベット") .font(.body) .bold() .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) .border(Color.gray) } Button(action:{ action = "レイズ" }){ Text("レイズ") .font(.body) .bold() .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) .border(Color.gray) } Button(action:{ action = "オールイン" }){ Text("オールイン") .font(.body) .bold() .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) .border(Color.gray) } .padding(.bottom) Text(action) Button (action:{ withAnimation(){ partialSheetManager.closePartialSheet()} }){ Text("閉じる") } .padding(.vertical,50.0) } .frame(height:250) }

struct HomeView_Previews: PreviewProvider {
static var previews: some View {
HomeView()
.addPartialSheet()
.environmentObject(PartialSheetManager())
}
}
}

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

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

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

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

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

guest

回答1

0

homeviewで@Stateの変数をもち、PartialSheetViewでその値を@Bindingでデータバインディングさせてあげればいいと思います。

以下の場合、PartialSheetViewにあるbuttonを押すとhomeviewの値が変わるかと思います。

swift

1struct HomeView: View { 2 3 @State var showPartial = false 4 @State var text: String = "" 5 6 var body: some View { 7 8 Button (action: { 9 showPartial.toggle() 10 }){ 11 Text(text) 12 .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 13 .border(Color.gray) 14 } 15 16 .partialSheet(isPresented: $showPartial) 17 { 18 PartialSheetView(text) 19 20 } 21 } 22} 23 24struct PartialSheetView: View { 25 26 @State var action = "" 27 @Binding var text: String = ""  // 追記 28 29 30 @EnvironmentObject var 31 partialSheetManager: 32 PartialSheetManager 33 34 var body: some View { 35 36 VStack(spacing: 10){ 37 38 Text("") 39 .padding(.top,200) 40 41 Button(action:{ 42 action = "フォールド" 43 text = "フォールド" // 追記 44 }){ 45 Text("フォールド") 46 .font(.body) 47 .bold() 48 .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 49 .border(Color.gray) 50 } 51 52 Button(action:{ 53 action = "チェック" 54 text = "チェック" // 追記 55 }){ 56 Text("チェック") 57 .font(.body) 58 .bold() 59 .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 60 .border(Color.gray) 61 } 62 63 Button(action:{ 64 action = "ストラドル" 65 text = "ストラドル" // 追記 66 }){ 67 Text("ストラドル") 68 .font(.body) 69 .bold() 70 .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 71 .border(Color.gray) 72 } 73 74 Button(action:{ 75 action = "ベット" 76 text = "ベット" // 追記 77 }){ 78 Text("ベット") 79 .font(.body) 80 .bold() 81 .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 82 .border(Color.gray) 83 } 84 85 Button(action:{ 86 action = "レイズ" 87 text = "レイズ" // 追記 88 }){ 89 Text("レイズ") 90 .font(.body) 91 .bold() 92 .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 93 .border(Color.gray) 94 } 95 96 Button(action:{ 97 action = "オールイン" 98 text = "オールイン" //追記 99 }){ 100 Text("オールイン") 101 .font(.body) 102 .bold() 103 .frame(width: 100, height: 30, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 104 .border(Color.gray) 105 } 106 107 .padding(.bottom) 108 109 Text(action) 110 111 Button (action:{ 112 withAnimation(){ 113 partialSheetManager.closePartialSheet()} 114 }){ 115 Text("閉じる") 116 } 117 .padding(.vertical,50.0) 118 119 } 120 .frame(height:250) 121 122 } 123

投稿2021/10/25 12:33

Pomu3270

総合スコア280

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

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

shokotaso

2021/10/27 15:47

回答ありがとうございます 追記をしたところ ・HomeView .partialSheet(isPresented: $showPartial) { PartialSheetView(text) ここに 【Missing argument label 'action:' in callnsert 'action: '】 ・PartialSheetView @Binding var text: String =   ここに 【Cannot convert value of type 'String' to specified type 'Binding<String>'】 【Incorrect argument label in call (have 'wrappedValue:', expected 'projectedValue:')Replace '""' with 'projectedValue'】 のエラーが出ました。 エラーの意味は調べましたが、どこをどう修正すればいいかわかりませでした、、 何から何まで申し訳ないのですが、どうすればエラーがなくなるか教えていただければ嬉しいです、 よろしくお願い致します
Pomu3270

2021/10/27 15:54 編集

1個目 ・HomeView .partialSheet(isPresented: $showPartial) { PartialSheetView(text: text) ここ修正 2個目 struct PartialSheetView: View { @State var action = "" @Binding var text: String ここ修正 でどうでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問