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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1322閲覧

addSnapshotListenerを使ってデータをリアルタイムで更新すると、画面が自動で遷移してしまう

Natsu.mikan

総合スコア6

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/06 15:10

編集2020/05/06 15:11

FirestoreとSwiftを使用して、お気に入りの映画を登録するアプリを開発しています。

画面構成

  • お気に入りの映画の一覧画面(初期画面)
  • すべての映画一覧画面
  • 映画の詳細画面(お気に入りに追加できる)

困っていること

お気に入りに映画を追加するために、
0. 「MovieSearchView」に遷移

  1. 映画を選択し、「MovieDetailView」に遷移
  2. 「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を使って実現する方法が知りたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問