いいねした投稿をまとめて見れるような機能を作りたいのですが、うまくいきません。
いいねのボタンを押すと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/
変更した値をどこに保存したいのでしょうか?
@State var like : Bool
の値をtureに変えて保持したいです。
ナビゲーションリンクを使っているのですが、一つ前の画面に遷移するとリセットされてしまいます
PhotoData は構造体なので、PhotodetailView にはコピーが渡って、変更される値もコピーだからでしょうね。
classにすれば良いということでしょうか??
プログラミング初心者でよくわかっておらず申し訳ありません
質問文のコードだけで言うと、PhotoData を class にして、var like を @Published にして、PhotoData のイニシャライザを定義して、LikeButton(isLike: $photo.like, 〜) にして、PhotodetailView の isLike は不要で、onTapped の中身も不要ですが、呼び出し元との連携とか、値の永続化とかまで考えるとなかなか難しいですね。
返信遅れて申し訳ありません。
ありがとうございます。参考にさせていただきます
あなたの回答
tips
プレビュー