Я пытался несколькими способами передать свои данные из базы данных TableViewCell в ViewController и не могу найти самое простое решение.

У меня есть EncounterTableViewController с EncounterTableViewCells. Это заполнено данными Firebase. Когда выбран EncounterTableViewCell, я хочу передать данные в EncounterDetailViewController.

Встречи TableViewController.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
pjmanning 29 Май 2017 в 07:22

2 ответа

Лучший ответ

Вместо передачи dictionary вам нужно передать объект Encounter, поэтому объявите одно свойство экземпляра типа Encounter в вашем EncounterDetailViewController с именем selectedEncounter. Теперь в prepareForSegue методе EncountersTableViewController передайте объект Encounter из массива в этот 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]
        }
    }
} 

Encounter DetailViewController

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
    }
}
1
Nirav D 29 Май 2017 в 05:15

В EncountersTableViewController добавьте метод делегата tableView, func tableView(UITableView, didSelectRowAt: IndexPath), и внутри этого метода вы можете получить выбранную встречу из массива встреч с помощью indexPath.row. После того, как вы получите встречу, вы можете performSegue(withIdentifier: "segueToEncounterCard" , sender: encounter ).

А в методе prepareForSegue вы можете получить встречу, передав значение отправителя как объект Encounter, и вы можете передать встречу по назначению.

0
noob 29 Май 2017 в 05:09