Как передать переменные из secondViewController в функцию loadData () в TableViewController? - PullRequest
0 голосов
/ 10 сентября 2018

Это мое первое тренировочное приложение Swift / Firestore, и я пытаюсь получить доступ к переменным (eventLocation, eventDate) в файле 'AddEventViewController', который будет использоваться в файле 'EventTableViewController'.

Однако я не могу понять, чего не хватает, или я делаю неправильно.

Буду признателен за помощь тех, кто гораздо опытнее. Большое спасибо заранее!

Это моя раскадровка

EventTableViewController.swift

import UIKit
import FirebaseFirestore

class EventsTableViewController: UITableViewController {

 var eventsArray = [Event]()

 override func viewDidLoad() {
    super.viewDidLoad()
    loadData()
}

func loadData() {
// How to pass variables from 'AddEventViewController' and use it inside this function??

   Firestore.firestore().collection("Locations").document(??).collection("Dates").document(??).collection("Events").getDocuments() { (querySnapshot, error) in
        if let error = error {
            print("Error getting documents: \(error)")
        } else {
            self.eventsArray = querySnapshot!.documents.compactMap({Event(dictionary: $0.data())})
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }
}
override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return eventsArray.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "eventCell", for: indexPath)

    let event = eventsArray[indexPath.row]

    // Configure the cell...
    cell.textLabel?.text = "\(event.programType)"
    cell.detailTextLabel?.text = "\(event.eventLocation) \(event.eventDate)"

    return cell
}

AddEventViewController.swift

import UIKit
import FirebaseFirestore

class AddEventViewController: UIViewController {

@IBOutlet weak var eventLocation: UITextField!
@IBOutlet weak var eventDate: UITextField!
@IBOutlet weak var programType: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func saveEventButtonTapped(_ sender: UIBarButtonItem) {
// Check if textfields are not empty
    guard let EventLocation = eventLocation.text, !EventLocation.isEmpty else { return }
    guard let EventDate = eventDate.text, !EventDate.isEmpty else { return }
    guard let Program = programType.text, !Program.isEmpty else {return}

**// need to find a way to pass variables i.e. eventLocation and eventDate to 'EventsTableViewController'**        

    // Save profile details of person to Firestore as data fields
    let eventDetail: [String: Any] = ["Event Location": EventLocation, "Event Date": EventDate, "Program": Program]

    // Write data to Firestore
    Firestore.firestore().collection("Locations").document(EventLocation).collection("Dates").document(EventDate).collection("Events").document(Program).setData(eventDetail)
    { error in
        if let error = error {
            print("ERROR: Event not saved to database. Please try again! \(error)")
        } else {
            print("Event has been saved to the database!")
        }
        self.dismiss(animated: true, completion: nil)
    }
}

Event.swift

struct Event {
var programType: String
var eventLocation: String
var eventDate: String

var dictionary: [String: Any] {
    return [
        "programType": programType,
        "eventLocation" : eventLocation,
        "eventDate" : eventDate
    ]
}
}

extension Event : DocumentSerializable {
init?(dictionary: [String: Any]) {
    guard let programType = dictionary["Program"] as? String,
        let eventLocation = dictionary["Event Location"] as? String,
        let eventDate = dictionary["Event Date"] as? String else { return nil}

    self.init(programType: programType, eventLocation: eventLocation, eventDate: eventDate)
}
}

1 Ответ

0 голосов
/ 10 сентября 2018

Есть один способ сделать это, вы можете добавить loadData() в viewWillAppear метод, как показано ниже:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    loadData()
}

и удалите его из viewDidLoad, потому что viewDidLoad будет вызывать только один раз при загрузке представления. Но viewWillAppear будет звонить каждый раз, когда вы посещаете вид. Таким образом, он будет получать свежие данные с сервера каждый раз, когда вы возвращаетесь к предыдущему виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...