2017-05-29 6 views
0

私はfirebaseデータをTableViewCellからViewControllerに渡すために複数の方法を試してきましたが、最も単純な解決策を見つけることはできません。FireViewのデータをTableViewCellからViewControllerに渡します。

私はEncounterTableViewCellsを持つEncounterTableViewControllerを持っています。これにはFirebaseデータが入力されます。 EncounterTableViewCellが選択されると、データをEncounterDetailViewControllerに渡します。 EncountersTableViewControllerで

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

はdestinationControllerにUITableViewCellのから接続セグエていますか? –

+0

'EncountersTableViewController'から' EncounterDetailViewController'にどのようにナビゲートしていますか? – nayem

+0

SegueはEncounterTableViewCellからEncounterDetailViewControllerに接続されています – pmanning

答えて

1

。今EncountersTableViewControllerprepareForSegue方法でこの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のオブジェクトを渡す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

ああ@Niravの情報をありがとう!辞書情報にアクセスしようとしていました。よりシンプルな方法が必要であることが分かっていました。 – pmanning

+0

@pmanning Welcome mate :)もう一つは、Swiftのネイティブ型配列と辞書でNSArrayとNSDictionaryを使用しないで、このようなメディア配列を取り出すことができるということを忘れてしまいました。restDict ["media "]として! [[String:Any]] 'は辞書の配列として配列を指定するので、最初のオブジェクトを辞書にキャストする必要はありません。 –

+0

ありがとう@Niravは実際にネストされたデータを取得する次のタスクに役立ちます:) – pmanning

0

のtableViewデリゲートメソッド、func tableView(UITableView, didSelectRowAt: IndexPath)を追加し、このメソッド内で、あなたはindexPathを使って出会いの配列から選択された出会いを得ることができます。行。あなたは出会いを得た後にperformSegue(withIdentifier: "segueToEncounterCard" , sender: encounter)することができます。

prepareForSegueメソッドでは、送信者の値をEncounterオブジェクトとしてキャストしてエンカウンターを取得し、そのエンカウンターを宛先に渡すことができます。代わりにあなたがEncounterのオブジェクトを渡し、そのように命名selectedEncounterであなたのEncounterDetailViewControllerタイプEncounterの1つのインスタンスプロパティを宣言する必要がdictionaryを渡すの

関連する問題