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

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

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

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

1107閲覧

SwiftUIで一覧から詳細に遷移する時に値(id)を渡し、更にその値を詳細内で呼ばれるモデルに受け渡す方法

omomo

総合スコア3

iOS

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

1グッド

1クリップ

投稿2020/06/07 05:58

前提・実現したいこと

SwiftUI(Swift5)で、iPhoneアプリを開発しています。

商品一覧から商品を選び詳細ページへ遷移させます。
詳細ページに表示する情報は、非同期で別サイトにある情報を取ってきて設定する予定です。

詳細ページに遷移する際、値(id)を詳細ページ渡して、その値(id)で特定して
URLに設定することで、idに紐付けた情報を取っていくることを考えています。

以下のソースで実現しようとしています。
一覧ページの特定の行をタップして、詳細ページを開く時に値(id)を渡して、
詳細ページでモデル(LogItemDetailViewModel)を呼びに、その引数に値(id)を渡して、
非同期で抽出して結果を得たいのですが、うまくいきません。

NavigationLinkに「”詳細ページへ値(id)を渡したい”」に値を設定して、
詳細ページの、「”ここに値(id)を設定したい”」に値したいのですが
どのようにすれば値を受け渡すことができるのかご教示お願い致します。

該当のソースコード

SwiftUI(Swift5)

1// 一覧ページ(TopListView) 2struct TopListView: View { 3 @ObservedObject private var topListVM = TopListViewModel() 4 var body: some View { 5 NavigationView { 6 VStack(alignment: .leading) { 7 List(topListVM.logItemData){item in 8 NavigationLink(destination:LogItemDetailView(”詳細ページへ値(id)を渡したい”)) //<-- 詳細ページへ値(id)を渡したい 9{ 10 LogItemRowView(logItemData:item) 11 } 12 } 13 14 } 15 } 16 } 17} 18 19 20// 詳細ページ(LogItemDetailView) 21struct LogItemDetailView: View { 22 @ObservedObject private var logItemDetailVM = LogItemDetailViewModel(logItemId:”ここに値(id)を設定したい”) //<-- ここに値(id)を設定したい 23 var body: some View { 24 VStack(alignment: .leading) { 25  ・・・・ 26 } 27 } 28} 29 30// モデル(LogItemDetailViewModel) 31class LogItemDetailViewModel: ObservableObject { 32 var logItemId:String = "" 33 private let fetcher = LogItemDetailDataFetcher() 34 @Published var logItemDetailData:LogItemDetail! 35 36 init(logItemId:String) { 37 self.fetcher.logItemId = logItemId 38 self.fetcher.fetchLogItemDetailData { (rests) in 39 self.logItemDetailData = rests // 値(id)で、非同期で抽出したデータを設定する 40 } 41 } 42}
jun9👍を押しています

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。稚拙ですが解決したソースを載せました。

// 一覧ページ(TopListView) struct TopListView: View { @ObservedObject private var topListVM = TopListViewModel() var body: some View { NavigationView { VStack(alignment: .leading) { List(topListVM.logItemData){item in NavigationLink(destination:LogItemDetailView(logItemData:item)) //<-- 詳細ページへ値(id)をセット { LogItemRowView(logItemData:item) } } } } } } // 詳細ページ(LogItemDetailView) struct LogItemDetailView: View { var logItemData:LogItem //<-- ここで値を取得 @ObservedObject private var logItemDetailVM = LogItemDetailViewModel()//<-- ここでは値を渡さず初期化 var body: some View { VStack(alignment: .leading) { Text(logItemDetailVM.logItemDetailData.id) }.onAppear(perform:{ self.logItemDetailVM.getData(logItemId:self.logItemData.id)//<-- 値を受け取るgetDataメソッドで受け取る }) } } // モデル(LogItemDetailViewModel) class LogItemDetailViewModel: ObservableObject { private let fetcher = LogItemDetailDataFetcher() @Published var logItemDetailData:LogItemDetail! init() { let id:String = "" self.logItemDetailData = LogItemDetail(id: id) } func getData(logItemId:String)//<-- 値を受け取るgetDataメソッド { self.fetcher.logItemId = logItemId self.fetcher.fetchLogItemDetailData { (rests) in self.logItemDetailData = rests } } }

投稿2020/06/07 11:50

omomo

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問