2017-05-29 3 views
0

Ich habe mehrere Möglichkeiten versucht, meine Firebase-Daten von einer TableViewCell an einen ViewController zu übergeben und kann die einfachste Lösung nicht finden.Weitergabe von Firebase-Daten von TableViewCell an ViewController

Ich habe einen EncounterTableViewController mit EncounterTableViewCells. Dies ist mit Firebase-Daten gefüllt. Wenn eine EncounterTableViewCell ausgewählt ist, möchte ich die Daten an den EncounterDetailViewController übergeben.

EncountersTableViewController.swift

class EncountersTableViewController: UITableViewController { 

    var encounters : [Encounter] = [] 

    // MARK: - View Did load 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     showAllEncounters() 
    } 

    // MARK: - Encounter filters 
    func showAllEncounters() { 
     // Firebase tableview data 
     FIRDatabase.database().reference().child("encounters").observeSingleEvent(of: .value, with: { (snapshot) in 
     for rest in snapshot.children.allObjects as! [FIRDataSnapshot] { 

      guard let restDict = rest.value as? [String: Any] else { continue } 

      let encounter = Encounter() 
      encounter.sharkName = (restDict["shark_name"] as? String)! 
      encounter.date = (restDict["trip_date"] as? String)! 
      encounter.contributorName = (restDict["contributor"] as? String)! 
      encounter.contributorImage = (restDict["contributor_image"] as? String)! 


      let mediaDict = (restDict["media"] as? NSArray) 
      let firstImage = mediaDict![0] as! NSDictionary 
      encounter.mainImage = firstImage["thumb_url"] as! String 

      self.encounters.append(encounter) 

      self.tableView.reloadData() 
     } 
     }) 
    } 

    // MARK: - Navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "segueToEncounterCard" { 
      let destination = segue.destination as! EncounterDetailViewController 
     } 
    } 

EncounterDetailViewController.swift

class EncounterDetailViewController: UIViewController { 

// MARK: - Outlets 
@IBOutlet weak var encounterDateLabel: UILabel! 
@IBOutlet weak var locationLabel: UILabel! 
@IBOutlet weak var lengthLabel: UILabel! 
@IBOutlet weak var contributorNameLabel: UILabel! 
@IBOutlet weak var contributorImageView: UIImageView! 

// MARK: - Properties 
var dictionary: [String:AnyObject]? 

// MARK: - View did load 
override func viewDidLoad() { 
    super.viewDidLoad() 
} 
} 
+0

Wird aus UITableViewCell verbunden SEGUE destinationController? –

+0

Wie navigierst du von 'EncountersTableViewController' nach' EncounterDetailViewController'? – nayem

+0

Das Segment ist von der EncounterTableViewCell mit dem EncounterDetailViewController verbunden – pmanning

Antwort

1

Statt dictionary zugeben Sie Aufgabe Encounter übergeben müssen, so deklarieren eine Instanz Eigenschaft vom Typ Encounter in Ihrem EncounterDetailViewController mit selectedEncounter benannt. Nun in prepareForSegue Methode der EncountersTableViewController passieren das Objekt von Encounter von Array zu diesem detailViewController.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "segueToEncounterCard" { 
     let destination = segue.destination as! EncounterDetailViewController 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      destination.selectedEncounter = self.encounters[indexPath.row] 
     } 
    } 
} 

EncounterDetailViewController

class EncounterDetailViewController: UIViewController { 

    // MARK: - Outlets 
    @IBOutlet weak var encounterDateLabel: UILabel! 
    @IBOutlet weak var locationLabel: UILabel! 
    @IBOutlet weak var lengthLabel: UILabel! 
    @IBOutlet weak var contributorNameLabel: UILabel! 
    @IBOutlet weak var contributorImageView: UIImageView! 

    // MARK: - Properties 
    var selectedEncounter: Encounter? 

    // MARK: - View did load 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     //access selectedEncounter property here and set all label's text 
    } 
} 
+0

Ahh danke für die Info @Nirav! Ich habe versucht, auf die Wörterbuchinformationen zuzugreifen. Ich wusste, dass es einen einfacheren Weg geben musste. – pmanning

+0

@pmanning Willkommen Kumpel :), Eine weitere Sache, die ich vergaß zu sagen ist, dass nicht 'NSArray' und' NSDictionary' in Swift verwenden nativen Typ Array und Wörterbuch bedeutet, dass Sie Medien-Array wie diese 'RestDict ["Medien "] wie! [[String: Any]] 'muss jetzt nicht zum ersten Objekt für das Dictionary gewandelt werden, da wir das Array als Array des Dictionary angeben. –

+0

Dank @Nirav hilft tatsächlich bei meiner nächsten Aufgabe, einige verschachtelte Daten abzurufen :) – pmanning

0

In EncountersTableViewController die Methode Tableview Delegierten hinzufügen, func tableView(UITableView, didSelectRowAt: IndexPath) und innerhalb dieser Methode können Sie die ausgewählte Begegnung von Begegnung Array erhalten, indem indexPath mit .Reihe. Nachdem Sie die Begegnung erhalten haben, können Sie performSegue(withIdentifier: "segueToEncounterCard" , sender: encounter).

Und in PrepareForSegue -Methode, können Sie die Begegnung durch Gießen des Absenders Wert als Encounter-Objekt erhalten und Sie können die Begegnung an das Ziel übergeben.

Verwandte Themen