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

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

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

Q&A

0回答

298閲覧

いいねした投稿一覧を表示したいが、Boolの値が保持されない

kamat

総合スコア1

0グッド

0クリップ

投稿2021/02/23 09:35

いいねした投稿をまとめて見れるような機能を作りたいのですが、うまくいきません。

いいねのボタンを押すとboolの値が切り替わり、値がtrueになっている場合のみ表示しようと考えています。

ナビゲーションリンクを使って投稿を表示しているのですが、画面を一つ戻るといいねしたことになりません・(値がfalseになってしまいます。)
どのようにすれば値を保持できるのでしょうか。

また試しにいいねを押すと値が切り替わるかサクセスとサクセスならずで試したのですが、これもうまくいきませんでした(いいねを押してもbool値が変わっていませんでした)

どなたか教えてください!!

import SwiftUI var photoArray:[PhotoData] = makeData() struct PhotoData:Identifiable { var id : Int var imageName : String var title : String var body : String @State var like : Bool } func makeData()->[PhotoData]{ var dataArray:[PhotoData]=[] dataArray.append(PhotoData(id:1,imageName:"sample",title:"sample",body:"sample",like:true)) struct PhotodetailView :View{ @State private var isLike = false @State private var numberOfLikes = 0 @State var photo : PhotoData var body:some View{ VStack{ Image(photo.imageName) .resizable() .aspectRatio(contentMode: .fit) Text(photo.body) HStack { Text("いいね") LikeButton(isLike: $isLike, numberOfLikes: $numberOfLikes, onTapped: { if isLike == true { photo.like=true } else { photo.like=false } }) if photo.like == true{ Text("サクセス") } else{ Text("サクセスならず") } } Spacer() }.padding() .navigationTitle(Text(verbatim:photo.title)) .navigationBarTitleDisplayMode(.inline) } } struct Row: View { var photo:PhotoData var body: some View{ HStack{ Image(photo.imageName) .resizable() .frame(width:80,height:80) Text(photo.title) Spacer() } } } struct LikeButton: View { @Binding var isLike: Bool @Binding var numberOfLikes: Int private var onTapped: (() -> Void)? init(isLike: Binding<Bool>, numberOfLikes: Binding<Int>, onTapped: (() -> Void)? = nil) { self._isLike = isLike self._numberOfLikes = numberOfLikes self.onTapped = onTapped } var body: some View { HStack { configureLikeImage() Text("(numberOfLikes)") } } private func configureLikeImage() -> AnyView { var imageName = "heart" if self._isLike.wrappedValue { imageName = "heart.fill" } return AnyView( Image(systemName:imageName) .resizable() .frame(width: 20, height: 20) .padding() .onTapGesture { self._isLike.wrappedValue.toggle() if self._isLike.wrappedValue { self._numberOfLikes.wrappedValue += 1 } else { self._numberOfLikes.wrappedValue -= 1 } self.onTapped?() } ) } } struct LikeList: View { var body: some View { VStack { List(photoArray){item in if item.like == true{ PhotodetailView(photo:item) } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { LikeList() } }

いいねのボタンはこちらの記事を参考にしました
https://www.yururiwork.net/%E3%80%90swiftui%E3%80%91%E3%80%8C%E3%81%84%E3%81%84%E3%81%AD%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/

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

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

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

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

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

hoshi-takanori

2021/02/23 09:51

変更した値をどこに保存したいのでしょうか?
kamat

2021/02/23 09:56

@State var like : Bool の値をtureに変えて保持したいです。 ナビゲーションリンクを使っているのですが、一つ前の画面に遷移するとリセットされてしまいます
hoshi-takanori

2021/02/23 10:34

PhotoData は構造体なので、PhotodetailView にはコピーが渡って、変更される値もコピーだからでしょうね。
kamat

2021/02/23 10:41

classにすれば良いということでしょうか?? プログラミング初心者でよくわかっておらず申し訳ありません
hoshi-takanori

2021/02/23 10:46

質問文のコードだけで言うと、PhotoData を class にして、var like を @Published にして、PhotoData のイニシャライザを定義して、LikeButton(isLike: $photo.like, 〜) にして、PhotodetailView の isLike は不要で、onTapped の中身も不要ですが、呼び出し元との連携とか、値の永続化とかまで考えるとなかなか難しいですね。
kamat

2021/02/24 09:39

返信遅れて申し訳ありません。 ありがとうございます。参考にさせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問