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

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

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

Q&A

解決済

1回答

1388閲覧

TabViewで画面遷移をする際に、共通する変数の利用方法

tomaa

総合スコア84

0グッド

0クリップ

投稿2020/09/03 07:35

編集2020/09/03 07:37

前提・実現したいこと

SwuftUIを利用して、アプリを開発しています。

以下の条件で、以下の動作をしたいのですが、適切なコードの書き方がわかりません。

・条件

  • ①ContentView
  • ②FirstView
  • ③SecondView

の3つのstructがあり、①ContentView内のTabViewで②、③のview間を遷移する

・希望の動作
②と③のView間で共通の変数を(Bool型)を利用し、それぞれのViewで表示を変える
(変数がtrueであればTextが表示される)

発生している問題

こちらのサイトを参考にし、コードを作成していますが、うまく応用できません。

うまくいかない動作の事例

①:ViewModelで定義した共通の変数を、SecondViewで宣言、初期化し、BindingしてToggleメソッドに利用でき、SecondView内のみであれば希望どおりに動作するが、FirstViewに遷移するとSecondViewで設定した変数が引き継げない

②:参考にしているサイトの解説をみると、遷移先のFirstViewで共通の変数を初期化すると、値を引き継いで利用できないとあるため、宣言のみとすると、previewする時にエラーとなる。

このような状況なのですが、解決の方法についてご存知の方おりましたら、ご教授いただけないでしょうか?

該当のソースコード

ContentView

SwiftUI

1import SwiftUI 2 3struct ContentView: View { 4 var body: some View { 5 TabView { 6 FirstView() 7 .tabItem { 8 Text("First") 9 }.tag(1) 10 11 SecondView() 12 .tabItem { 13 Text("Second") 14 }.tag(3) 15 } 16 } 17} 18 19struct ContentView_Previews: PreviewProvider { 20 static var previews: some View { 21 ContentView() 22 } 23} 24

FirstView

SwiftUI

1import SwiftUI 2 3struct FirstView: View { 4 5 @ObservedObject var firstCheck: ViewModel = ViewModel() //エラーがでないように初期化しています 6 7 var body: some View { 8 VStack{ 9 if firstCheck.check == true{ 10 Text("checked") 11 } 12 } 13 } 14} 15 16struct FirstView_Previews: PreviewProvider { 17 static var previews: some View { 18 FirstView() 19 } 20}

SecondView

SwiftUI

1import SwiftUI 2 3struct SecondView: View { 4 5 @ObservedObject var secondCheck = ViewModel() 6 7 8 var body: some View { 9 VStack{ 10 Toggle( 11 isOn: $secondCheck.check 12 ){ 13 Text("change") 14 } 15 if self.secondCheck.check == true{ 16 Text("checked") 17 } 18 } 19 } 20} 21 22struct SecondView_Previews: PreviewProvider { 23 static var previews: some View { 24 SecondView() 25 } 26}

ViewModel

swift

1import Foundation 2 3final class ViewModel: ObservableObject { 4 @Published var check: Bool = false 5}

補足情報(FW/ツールのバージョンなど)

Xcode: Version 11.7

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

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

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

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

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

guest

回答1

0

自己解決

下記のコードとする事で対応する事ができました。

ContentView

import SwiftUI struct ContentView: View { @ObservedObject var viewModel = ViewModel() var body: some View { TabView { FirstView() .tabItem { Text("First") }.tag(1) SecondView() .tabItem { Text("Second") }.tag(2) }.environmentObject(viewModel) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }

FirstView

import SwiftUI struct FirstView: View { @EnvironmentObject var firstCheck: ViewModel var body: some View { VStack{ if firstCheck.check == true{ Text("checked") } } } } struct FirstView_Previews: PreviewProvider { static var previews: some View { FirstView() } }

SecondViewもFirstView同様に宣言する。

投稿2020/09/03 12:14

tomaa

総合スコア84

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問