将Firebase数据从TableViewCell传递到ViewController
我一直在尝试多种方式将我的Firebase数据从TableViewCell传递到ViewController,但无法找出最简单的解决方案。将Firebase数据从TableViewCell传递到ViewController
我有一个EncounterTableViewController与EncounterTableViewCells。这是由Firebase数据填充的。当选择EncounterTableViewCell时,我想将数据传递给EncounterDetailViewController。
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()
}
}
不是传递dictionary
你需要传递的Encounter
对象,所以在你的EncounterDetailViewController
名为selectedEncounter
声明Encounter
类的一个实例属性。现在在EncountersTableViewController
prepareForSegue
方法传递的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]
}
}
}
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
}
}
在EncountersTableViewController添加的tableView委托方法,func tableView(UITableView, didSelectRowAt: IndexPath)
并且此方法内,可以通过使用indexPath得到遭遇阵列所选遭遇。行。遇到相遇后,您可以performSegue(withIdentifier: "segueToEncounterCard" , sender: encounter)
。
而在prepareForSegue方法中,您可以通过将发件人值强制转换为Encounter对象来获得相遇,并且可以将相遇传递给目标。
是SEGUE从的UITableViewCell连接到destinationController? –
如何从EncountersTableViewController导航到EncounterDetailViewController? – nayem
Segue从EncounterTableViewCell连接到EncounterDetailViewController – pmanning