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

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

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

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

Q&A

解決済

1回答

3678閲覧

【SwiftUI】Binding変数の初期化について

ishiishiyay

総合スコア33

Swift

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

0グッド

0クリップ

投稿2021/12/08 09:05

Binding変数の初期化ができず、困っています。お力添えいただけますと幸いです。

やろうとしていること:MyPageViewで@BindingのshouldNavigateを定義し、MyPageViewでボタンを押したらReceive Answers View Model内の関数を呼び出し、その関数内でshouldNavigateをtrueに変えることで、MyPageViewのshouldNavigateの値も更新しようとしています。

前提となるコード:

MyPageView

1struct MyPageView: View { 2 //略 3 @EnvironmentObject var viewModel: AuthViewModel 4 @ObservedObject var myPageViewModel = MyPageViewModel() 5 @ObservedObject var receiveAnswersViewModel = ReceiveAnswersViewModel() 6 @Binding var shouldNavigate: Bool 7 8 init() { 9 myPageViewModel.fetchMySentAnswers() 10 myPageViewModel.fetchMyReceivedAnswers(isUnreleasedOnly: false) 11 } 12 13//略 14 15//Buttonを押したら、次の関数を呼び出し:receiveAnswersViewModel.fetchAnswers(answers_id: answersId ?? 0) 16 17

ViewModel

1class ReceiveAnswersViewModel: ObservableObject { 2 3 @Published var shouldNavigate = false 4 //略 5 //fetchAnswers関数内で下記記載 6  self.shouldNavigate = true 7

MyPageViewの呼び出し元のMainTabView

MainTabView

1 2struct MainTabView: View { 3 @Binding var selectedIndex: Int 4 @ObservedObject var viewModel = MyPageViewModel() 5 6 var body: some View { 7 TabView { 8 9 NotificationView() 10 .onTapGesture { 11 selectedIndex = 0 12 } 13 14 .tabItem { 15 Text("新着") 16 } 17 18 AnswerFeedView() 19 .onTapGesture { 20 selectedIndex = 1 21 } 22 .tabItem { 23 Text("回答する") 24 } 25 26 MyPageView(shouldNavigate: $viewModel.shouldNavigate) //ここでエラー 27 .onTapGesture { 28 selectedIndex = 2 29 } 30 .tabItem { 31 Text("マイページ") 32 } 33 } 34 .onAppear { 35 print("Main Tab View appeared!") 36 } 37 38 39 40 } 41}

エラー内容:

MainTabViewでMyPageViewを呼び出す際に、初期化用の引数を渡そうとしたら、2つのエラーが生じます。

//Argument passed to call that takes no arguments
//Value of type 'ObservedObject<MyPageViewModel>.Wrapper' has no dynamic member 'shouldNavigate' using key path from root type 'MyPageViewModel'

(他の機能開発はこの方法でうまくいっていたので、不可解です。)

@Binding変数を初期化しないといけないので、このままビルドすると、MyPageViewでは下記のようなエラーが出てしまいます。

MyPageView

1self' used before all stored properties are initialized

MyPageView

1Return from initializer without initializing all stored properties

試したこと

なお、[こちらのリンク]を参照し、MyPageViewのイニシャライザの中に下記のように記載すると、

SwiftUI

1 init(shouldNavigate: Binding<Bool>) { 2 self._shouldNavigate = shouldNavigate //追加 3 myPageViewModel.fetchMySentAnswers() 4 myPageViewModel.fetchMyReceivedAnswers(isUnreleasedOnly: false) 5 } 6

MainTabViewで下記のエラーは無くなるものの、

MainTabView

1//Argument passed to call that takes no arguments

もう1つのエラーは残ったままでした。

MainTabView

1//Value of type 'ObservedObject<MyPageViewModel>.Wrapper' has no dynamic member 'shouldNavigate' using key path from root type 'MyPageViewModel' 2

少しでもアドバイス頂戴できますと幸いです。何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

すみません、自己解決しました。
init()を取り除くか、init()の書き方を調整する必要がありました。

https://stackoverflow.com/questions/68324357/swiftui-argument-passed-to-call-that-takes-no-arguments

投稿2021/12/08 11:30

ishiishiyay

総合スコア33

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問