[英]Pass Firebase Data from TableViewCell to ViewController
[英]How to receive upon clicking tableviewcell specific Firebase data to the viewcontroller?
我正在使用Firebase構建快速的應用程序,在我的Firebase數據庫中,我擁有(子)餐館,並提供相關信息。 我已成功將firebase集成到我的項目中,並通過使用SDWebImage使用帶有圖像的firebase數據填充了tableview。 但是,現在我仍然遇到另一個問題,即單擊表視圖單元格后,就會使用segue並從firebase數據庫中檢索正確的數據。 過去,我已經使用detailViewControllers成功構建了多個swift和Objective-c的表視圖,但這是我第一次使用Firebase。 在此先感謝您:)下面我從xcode傳遞代碼:
主要Tableview:導入UIKit導入Firebase導入FirebaseAuth導入FirebaseDatabase導入FirebaseStorage導入SDWebImage
類MainTableVC:UITableViewController {
@IBOutlet weak var MenuBar: UIBarButtonItem!
var barName = [String]()
var barMainImage = [String]()
var barAddress = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
MenuBar.target = self.revealViewController()
MenuBar.action = #selector(SWRevealViewController.revealToggle(_:))
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
getDataFromServer()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func getDataFromServer(){
Database.database().reference().child("aktau").observe(DataEventType.childAdded, with: { (snapshot) in
let values = snapshot.value! as! NSDictionary
let posts = values["barmain"] as! NSDictionary
let postIDs = posts.allKeys
for id in postIDs{
let singlePost = posts[id] as! NSDictionary
self.barName.append(singlePost["barname"] as! String)
self.barAddress.append(singlePost["baraddress"] as! String)
self.barMainImage.append(singlePost["barmainimage"] as! String)
}
self.tableView.reloadData()
})
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return barName.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "RestoCell", for: indexPath) as! ViewControllerCell
cell.RestName.text = barName[indexPath.row]
cell.RestAddress.text = barAddress[indexPath.row]
cell.RestImage.sd_setImage(with: URL(string: barMainImage[indexPath.row]))
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "DetailView") {
let VC = segue.destination as! DetailViewController
VC.RestNameData = barName
}
barName問題 -
無法將類型“ [String]”的值分配給類型“ String?”
我的detailViewController除了BarName,BarAddress和BarMainImage之外,我還希望提供簡短的酒吧信息和營業時間。
導入UIKit導入Firebase導入FirebaseAuth導入FirebaseDatabase導入FirebaseStorage導入SDWebImage
類DetailViewController:UIViewController {
@IBOutlet weak var MyScroll: UIScrollView!
@IBOutlet weak var RestDetailView: UIView!
@IBOutlet weak var restName: UILabel!
@IBOutlet weak var restTypeOfFood: UILabel!
@IBOutlet weak var restClockImage: UIImageView!
@IBOutlet weak var restOpenHours: UILabel!
@IBOutlet weak var restInfoView: UIView!
@IBOutlet weak var averagePrice: UILabel!
@IBOutlet weak var InfoAboutRest: UILabel!
@IBOutlet weak var FullAddressLabel: UILabel!
@IBOutlet weak var OpeningHoursLabel: UILabel!
var RestNameData: String?
override func viewDidLoad() {
super.viewDidLoad()
self.RestDetailView.layer.borderColor = UIColor.white.cgColor
self.RestDetailView.layer.borderWidth = 1
self.restInfoView.layer.borderColor = UIColor.white.cgColor
self.restInfoView.layer.borderWidth = 1
if RestNameData.text == "" {
}
}
}
我的Firebase數據庫樹 : 在此處輸入圖像描述
這是解決您所面臨問題的一種方法。 首先,最好使用單個變量來保存要在表中顯示的對象的集合:即
// Define your model
struct Bar {
var name: String
var image: String
var address: String
}
// Change your variables
var bars = [Bar]()
var selectedBar: Bar?
其次,您需要根據單元格的選擇獲得單個bar
對象。 即
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
selectedBar = bars[indexPath.row]
}
隔離后,可以將其注入到您的detailsVC
如下所示:
details.selectedBar = selectedBar
您已經完成了selectedBar
對象來為UI充氣,而不僅僅是String
。
附加示例:我創建了一個具有所需功能的示例。 拉代碼時執行pod安裝。 這是我的數據庫的樣子:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.