Я кодирую с января 2019 года, и это мой первый пост здесь.
Я использую Swift и Firestore. В моем приложении есть табличное представление, в котором я отображаю события, загруженные из одного документа, с массивом событий внутри, как [String: [String: Any]]. Если пользователь хочет получить больше информации о событии, он нажимает на него. В фоновом режиме TableViewController откроет новый «DetailEventViewController» с переходом и передаст ему значение eventID в повернутой ячейке.
Когда пользователь находится на экране DetailViewController, приложение загрузит новый документ с EventID в качестве ключа для документа.
Я хочу сохранить эти данные из Firestore в структуре под названием Event. Для этого примера только с Event (eventName: String).
Когда я получаю все данные, я могу распечатать их напрямую, но не могу сохранить их в переменной и распечатать позже. Я действительно не знаю почему. Если я печатаю структуру INSIDE, скобки, где я получаю данные, работают, но если я сохраняю их в переменную и пытаюсь использовать эту переменную, она говорит, что ее ноль.
Так, как я могу извлечь данные из Firestore и сохранить только в одном ValueObject (var currentEvent = Event? -> currentEvent = Event.event (для: data as [String: Any]))
Я выполняю поиск в google, firebaseDoc и stackoverflow, но ничего не нашел по этому поводу, поэтому я попытался сохранить все отдельные данные в отдельном значении.
// Struct
struct Event {
var eventName: String!
static func event(for eventData: [String:Any]) -> Event? {
guard let _eventName = eventData["eventName"] as? String
else {
print("error")
return nil
}
return Event(eventName: _eventName)
}
// TableView VC это должно работать
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ShowEventDetailSegue" {
if let ShowEvent = segue.destination as? DetailEventViewController, let event = eventForSegue{
ShowEvent.currentEventId = event.eventID
}
}
}
// DetailViewController
var currentEvent = Event()
var currentEventId: String?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
guard let _eventID = currentEventId else {
print("error in EventID")
return}
setupEvent(eventID: _eventID) /* currentEvent should be set here */
setupView(event: currentEvent) /* currentEvent has after "setupEvent" the value of nil */
}
func setupEvent(eventID: String) {
let FirestoreRef = Firestore.firestore().collection("events").document(eventID)
FirestoreRef.getDocument { (document, error) in
if let err = error {
debugPrint("Error fetching docs: \(err)")
SVProgressHUD.showError(withStatus: "Error in Download")
}else {
if let document = document, document.exists {
guard let data = document.data() else {return}
let eventData = Event.event(for: data as [String:Any])
print(eventData)
//here all infos are printed out - so I get them
self.currentEvent = eventData!
//Here is the error.. I can't save the fetched Data in my single current Event
} else {
SVProgressHUD.showError(withStatus: "Error")
}
}
}
}
func setupView(event: Event) {
self.titleLabel.text = event.eventName
}
Я ожидаю, что функция setupEvents передаст currentEvent в DetailViewController значение SINGLE, поскольку его документ SINGLE не является массивом. Так что я могу использовать это единственное Eventvalue для дальнейших действий. Как начать новый переход для нового ViewController и просто отправить событие туда, а не