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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1918閲覧

SwiftUI .sheetを使う際 sheet上で値が更新されない原因を知りたい

kizahashi

総合スコア17

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2022/05/08 08:42

お世話になっております。

SwiftUIにおいて.sheetを使う際 sheet上で値が更新されないので困っております。

以下のコードはテキストをタップすると変数textが"A"から"B"に変わり.sheetが発火するコードになっていますが,
sheet上表示されるテキストは"A"のままです。
isPresentedをtrueにした後に出力して確認するとtextは"B"にちゃんと変わっています。
しかしこれで何回テキストをタップしても画面上の表示は変わりません。
なぜ遅延処理などもしているのに変わらないのでしょうか

原因もしくは解決策を教えていただきたいです。
よろしくお願いいたします。

Swift

1import SwiftUI 2 3struct ContentView: View { 4 @State var isPresented = false 5 @State var text = "A" 6 7 var body: some View { 8 9 Text("Hello, world!") 10 .padding().onTapGesture { 11 text = "B" 12 DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { 13 isPresented = true 14 print("text",text)//出力結果: text B 15 } 16 }.sheet(isPresented: $isPresented) { 17 Text(text)//ここではAと表示されてしまう 18 } 19 } 20} 21 22struct ContentView_Previews: PreviewProvider { 23 static var previews: some View { 24 ContentView() 25 } 26} 27

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

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

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

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

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

guest

回答1

0

ベストアンサー

正確な理由は分かりませんが、Text("Hello, world!")の上にText(text)を置くとsheet先でも値が更新されます。

しかし基本的に?SwiftUIで別画面と値を共有したい場合はBindingを使ったりします。

swift

1import SwiftUI 2 3struct ContentView: View { 4 @State var isPresented = false 5 @State var text = "A" 6 7 var body: some View { 8 Text("Hello, world!") 9 .padding() 10 .background(.red) 11 .onTapGesture { 12 text = "B" 13 isPresented = true 14 } 15 .sheet(isPresented: $isPresented) { 16 SubView(text: $text) 17 //Text(text)//ここではAと表示されてしまう 18 } 19 } 20} 21 22struct SubView: View { 23 @Binding var text: String 24 25 var body: some View { 26 Text(text) 27 } 28}

以下のようにしてみるとA画面で2秒後にtextが変更されるようにするとB画面で自動で反映されたりします。

swift

1.onTapGesture { 2 text = "B" 3 isPresented = true 4 5 Task { 6 try? await Task.sleep(nanoseconds: 2_000_000_000) 7 text = "C" 8 } 9 }

投稿2022/05/09 09:01

zundaa

総合スコア101

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

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

kizahashi

2022/05/09 09:48

コードをコピペさせていただき、確認したところちゃんと値が変わっていました! @Bindingを使わないといけないんですね。 @Bindingは使う際は必ずViewをStructで新しく定義しないといけないのでしょうか? 最初のコードのようにViewを作らずText()の中に@Binding変数をそのまま入れるとエラーが出ました。 もしよろしければご返信お願いします。 とてもわかりやすいコードのご提示,ご回答ありがとうございます!
zundaa

2022/05/09 10:18

コードとエラーによりますが、基本新しいView(struct)で構成します。
kizahashi

2022/05/09 10:31

わかりました。それが基本なんですね! 基本的にViewを定義していきたいと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問