FirestoreとSwiftを使用して、お気に入りの映画を登録するアプリを開発しています。
画面構成
- お気に入りの映画の一覧画面(初期画面)
- すべての映画一覧画面
- 映画の詳細画面(お気に入りに追加できる)
困っていること
お気に入りに映画を追加するために、
0. 「MovieSearchView」に遷移
- 映画を選択し、「MovieDetailView」に遷移
- 「Add」ボタンをクリック
と操作すると、MovieDetailViewから自動的にMovieSearchViewに遷移してしまいました。
「Add」ボタンを押しても「MovieDetailView」にとどまるにはどうしたらいいですか?
Swift
1import SwiftUI 2import FirebaseFirestore 3import Foundation 4 5struct FavoriteMovieListView: View { 6 @ObservedObject var favoriteMoviesFetcher = FavoriteMoviesFetcher() 7 @State private var modalPresented: Bool = false 8 9 var body: some View { 10 VStack { 11 Button(action: { 12 self.modalPresented.toggle() 13 }) { 14 Text("Search") 15 } 16 .sheet(isPresented: self.$modalPresented) { 17 MovieSearchView(onDismiss: { 18 self.modalPresented = false 19 }) 20 } 21 22 List(self.favoriteMoviesFetcher.data) { movie in 23 Text(movie.title) 24 } 25 } 26 } 27} 28 29struct MovieSearchView: View { 30 @ObservedObject var allMovieFetcher = AllMovieFetcher() 31 var onDismiss: () -> () 32 33 var body: some View { 34 NavigationView { 35 List(allMovieFetcher.data) { movie in 36 NavigationLink( 37 destination: MovieDetailView( 38 movie: movie 39 ) 40 ) { 41 Text(movie.title) 42 } 43 } 44 } 45 } 46} 47 48struct MovieDetailView: View { 49 @State var movie: MovieModel 50 51 var body: some View { 52 Button(action: { 53 FavoriteMoviesService().addMovie(movie: self.movie) 54 }) { 55 Text("Add") 56 } 57 } 58} 59 60class FavoriteMovieFetcher: ObservableObject { 61 @Published var data: [MovieModel] = [] 62 63 private var db: Firestore! 64 private var uid: String 65 66 init() { 67 db = Firestore.firestore() 68 uid = UserDefaults.standard.object(forKey: "userUid") as! String 69 70 fetchData() 71 } 72 73 private func fetchData() { 74 self.db.collection("favoriteMovies/(uid)/movies").addSnapshotListener { querySnapshot, error in 75 76 guard let snapshot = querySnapshot else { 77 print("Error fetching snapshots: (error!)") 78 return 79 } 80 81 snapshot.documentChanges.forEach { diff in 82 if (diff.type == .added) { 83 self.data.append(MovieModel( 84 movieId: diff.document.documentID, 85 title: diff.document.data()["title"]as! String 86 )) 87 } else if (diff.type == .modified) { 88 89 } else if (diff.type == .removed) { 90 self.data = self.data.filter { $0.movieId != diff.document.documentID } 91 } 92 } 93 94 self.isLoading = false 95 } 96 } 97} 98 99class AllMovieFetcher: ObservableObject { 100 @Published var data: [MovieModel] = [] 101 private var db: Firestore! 102 103 init() { 104 db = Firestore.firestore() 105 fetchData() 106 } 107 108 private func fetchData() { 109 self.db.collection("movies").getDocuments { (snaps, err) in 110 if let err = err { 111 print("Error getting documents: (err)") 112 } 113 114 guard let snaps = snaps else { return } 115 116 for document in snaps.documents { 117 self.data.append( 118 MovieModel( 119 movieId: document.documentID, 120 title: document.data()["title"]as! String 121 ) 122 ) 123 } 124 } 125 } 126} 127 128class FavoriteMoviesService: ObservableObject { 129 private var db: Firestore! 130 private var uid: String 131 132 init() { 133 db = Firestore.firestore() 134 uid = UserDefaults.standard.object(forKey: "userUid") as! String 135 } 136 137 func addMovie(movie: MovieModel) { 138 self.db.collection("favoriteMovies/(uid)/movies").document(movie.movieId).setData([ 139 "title": movie.title 140 ]) { err in 141 if let err = err { 142 print("Error adding document: (err)") 143 } else { 144 145 } 146 } 147 } 148} 149 150struct MovieModel: Identifiable { 151 var id = UUID() 152 var movieId: String 153 var title: String 154}
self.db.collection("favoriteMovies/(uid)/movies").addSnapshotListener
ではなく、
self.db.collection("favoriteMovies/(uid)/movies").getDocuments
とすると遷移しなかったですが、
追加時にお気に入り一覧を更新したいので.addSnapshotListenerを使って実現する方法が知りたいです。
よろしくお願いいたします。
あなたの回答
tips
プレビュー