ViewModelでユーザー情報を取得するAPIを呼び、Modelに格納し、Viewに連携してあげたいです。
1つ目のやり方は成功したものの、コードを綺麗にするために2つ目のやり方を試したら失敗しました。
ご助言いただけますと幸いです。(MVVMアーキテクチャにおいて何かタブーなことをやっているのかもしれません。。)
何卒よろしくお願いいたします。
成功したコード
ViewModel
1class AuthViewModel: ObservableObject { 2 3@Published var userMe: User? //UserはユーザーIDや名前など諸々の情報が入るModelのStructです。 4 5init() {//アプリが開かれた瞬間にinitされる 6 fetchUserMe() 7 } 8 9 func fetchUserMe() { 10 //API通信 中略 11 self.userMe = try JSONDecoder().decode(User.self, from: data) 12} 13}
View
1//このViewは、NavigationLinkで遷移する先となる子Viewです。親Viewは省略させていただきます。 2struct ProfileHeaderView: View { 3 @EnvironmentObject var viewModel: AuthViewModel 4 5var body: some View { 6 HStack { 7 Text( viewModel.userMe?.usersName ?? "nil") 8} 9}
View
1@main 2struct FriendQA_SwiftUIApp: App { 3 4 @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate 5 var body: some Scene { 6 WindowGroup { 7 ContentView().environmentObject(AuthViewModel.shared) 8 } 9 } 10}
エラーになったコード
上記でうまくいくものの、AuthViewModelには既にたくさんの関数を書いてしまってごちゃごちゃしているので、
fetchUserMe関数を違うView Modelに移したいと思い、下記のコードに変えましたが、うまくいきませんでした。
ViewModel
1class AuthViewModel: ObservableObject { 2 3@ObservedObject var fetchUsersViewModel = FetchUsersViewModel() 4 5init() { //アプリが開かれた瞬間にinitされる 6 fetchUsersViewModel.fetchUserMe() 7 } 8}
ViewModel
1class FetchUsersViewModel: ObservableObject { 2 3@Published var userMe: User? 4 5 func fetchUserMe() { 6 //API通信 中略 7 self.userMe = try JSONDecoder().decode(User.self, from: data) 8 print(self.userMe) //ちゃんと中身も出力される 9} 10}
View
1struct ProfileHeaderView: View { 2 @ObservedObject var fetchUsersViewModel = FetchUsersViewModel() 3 4var body: some View { 5 HStack { 6 Text(fetchUsersViewModel.userMe?.usersName ?? "nil") //nilになってしまう 7 Text($fetchUsersViewModel.userMe.wrappedValue?.usersName ?? "nil") //nilになってしまう 8} 9}
最後まで読んでいただきありがとうございます。お手数ですが、お力添えいただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー