Я разрабатываю приложение iOS с использованием Firestore и Swift.
Приложение - это приложение для регистрации ваших любимых фильмов.
Экран состоит из:
- Список любимых фильмов
- Список всех фильмов
- Экран деталей видео
Вы можете использовать приведенный ниже код, чтобы добавить mov ie в ваши любимые.
Go в «MovieDetailView» из «MovieSearchView» и нажмите кнопку «Добавить».
Затем, по какой-то причине, он автоматически вернется в «Mov ie Search View».
Как я могу оставаться в MovieDetailView, даже если я нажму кнопку «Добавить»?
Спасибо.
import SwiftUI
import FirebaseFirestore
import Foundation
struct FavoriteMovieListView: View {
@ObservedObject var favoriteMoviesFetcher = FavoriteMoviesFetcher()
@State private var modalPresented: Bool = false
var body: some View {
VStack {
Button(action: {
self.modalPresented.toggle()
}) {
Text("Search")
}
.sheet(isPresented: self.$modalPresented) {
MovieSearchView(onDismiss: {
self.modalPresented = false
})
}
List(self.favoriteMoviesFetcher.data) { movie in
Text(movie.title)
}
}
}
}
struct MovieSearchView: View {
@ObservedObject var allMovieFetcher = AllMovieFetcher()
var onDismiss: () -> ()
var body: some View {
NavigationView {
List(allMovieFetcher.data) { movie in
NavigationLink(
destination: MovieDetailView(
movie: movie
)
) {
Text(movie.title)
}
}
}
}
}
struct MovieDetailView: View {
@State var movie: MovieModel
var body: some View {
Button(action: {
FavoriteMoviesService().addMovie(movie: self.movie)
}) {
Text("Add")
}
}
}
class FavoriteMovieFetcher: ObservableObject {
@Published var data: [MovieModel] = []
private var db: Firestore!
private var uid: String
init() {
db = Firestore.firestore()
uid = UserDefaults.standard.object(forKey: "userUid") as! String
fetchData()
}
private func fetchData() {
self.db.collection("favoriteMovies/\(uid)/movies").addSnapshotListener { querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error fetching snapshots: \(error!)")
return
}
snapshot.documentChanges.forEach { diff in
if (diff.type == .added) {
self.data.append(MovieModel(
movieId: diff.document.documentID,
title: diff.document.data()["title"]as! String
))
} else if (diff.type == .modified) {
} else if (diff.type == .removed) {
self.data = self.data.filter { $0.movieId != diff.document.documentID }
}
}
self.isLoading = false
}
}
}
class AllMovieFetcher: ObservableObject {
@Published var data: [MovieModel] = []
private var db: Firestore!
init() {
db = Firestore.firestore()
fetchData()
}
private func fetchData() {
self.db.collection("movies").getDocuments { (snaps, err) in
if let err = err {
print("Error getting documents: \(err)")
}
guard let snaps = snaps else { return }
for document in snaps.documents {
self.data.append(
MovieModel(
movieId: document.documentID,
title: document.data()["title"]as! String
)
)
}
}
}
}
class FavoriteMoviesService: ObservableObject {
private var db: Firestore!
private var uid: String
init() {
db = Firestore.firestore()
uid = UserDefaults.standard.object(forKey: "userUid") as! String
}
func addMovie(movie: MovieModel) {
self.db.collection("favoriteMovies/\(uid)/movies").document(movie.movieId).setData([
"title": movie.title
]) { err in
if let err = err {
print("Error adding document: \(err)")
} else {
}
}
}
}
struct MovieModel: Identifiable {
var id = UUID()
var movieId: String
var title: String
}