2017-05-29 70 views
0

我一直在尝试多种方式将我的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() 
} 
} 
+0

是SEGUE从的UITableViewCell连接到destinationController? –

+0

如何从EncountersTableViewController导航到EncounterDetailViewController? – nayem

+0

Segue从EncounterTableViewCell连接到EncounterDetailViewController – pmanning

回答

1

不是传递dictionary你需要传递的Encounter对象,所以在你的EncounterDetailViewController名为selectedEncounter声明Encounter类的一个实例属性。现在在EncountersTableViewControllerprepareForSegue方法传递的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 
    } 
} 
+0

Ahh感谢info @Nirav!试图访问字典信息。知道必须有一个更简单的方法。 – pmanning

+0

@pmanning欢迎队友:),我忘了说的另外一件事是,不要在Swift中使用NSArray和NSDictionary使用本地类型数组和字典意味着你可以像这样检索媒体数组restDict [“media “] as! [[String:Any]]'现在不需要将第一个对象转换为字典,因为我们将数组指定为字典数组。 –

+0

谢谢@Nirav实际上有助于我检索一些嵌套数据的下一个任务:) – pmanning

0

在EncountersTableViewController添加的tableView委托方法,func tableView(UITableView, didSelectRowAt: IndexPath)并且此方法内,可以通过使用indexPath得到遭遇阵列所选遭遇。行。遇到相遇后,您可以performSegue(withIdentifier: "segueToEncounterCard" , sender: encounter)

而在prepareForSegue方法中,您可以通过将发件人值强制转换为Encounter对象来获得相遇,并且可以将相遇传递给目标。

相关问题