【问题标题】:Pass Firebase Data from TableViewCell to ViewController将 Firebase 数据从 TableViewCell 传递到 ViewController
【发布时间】:2017-05-29 04:22:36
【问题描述】:

我一直在尝试多种方法将我的 firebase 数据从 TableViewCell 传递到 ViewController,但找不到最简单的解决方案。

我有一个带有 EncounterTableViewCells 的 EncounterTableViewController。这是用 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()
}
}

【问题讨论】:

  • segue 是否从 UItableViewCell 连接到 destinationController ?
  • 您如何从EncountersTableViewController 导航到EncounterDetailViewController
  • segue 从 EncounterTableViewCell 连接到 EncounterDetailViewController

标签: ios swift uitableview firebase firebase-realtime-database


【解决方案1】:

您需要传递Encounter 的对象,而不是传递dictionary,因此请在您的EncounterDetailViewController 中声明一个Encounter 类型的实例属性,名称为selectedEncounter。现在在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
    }
}

【讨论】:

  • 啊,谢谢@Nirav 的信息!试图访问字典信息。知道必须有更简单的方法。
  • @pmanning Welcome mate :),还有一件事我忘了告诉你,不要在 Swift 中使用 NSArrayNSDictionary 使用原生类型数组和字典意味着你可以检索媒体数组像这样restDict["media"] as! [[String:Any]] 现在不需要将第一个对象转换为字典,因为我们将数组指定为字典数组。
  • 感谢@Nirav 实际上帮助我完成了检索一些嵌套数据的下一个任务:)
【解决方案2】:

在 EncountersTableViewController 中添加 tableView 委托方法func tableView(UITableView, didSelectRowAt: IndexPath),在此方法中,您可以使用 indexPath.row 从遇到数组中获取选定的遭遇。遇到后可以performSegue(withIdentifier: "segueToEncounterCard" , sender: encounter ).

在 prepareForSegue 方法中,您可以通过将 sender 值转换为 Encounter 对象来获取遭遇,然后您可以将遭遇传递到目的地。

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多