如何通过点击tableviewcell特定的Firebase数据到视图控制器来接收?
我正在通过使用firebase构建一个快速应用程序,在我的firebase数据库中我有(儿童)餐厅的信息。我已成功将Firebase集成到我的项目中,并通过使用SDWebImage将带有Firebase数据的TableView填充到图像中。但是现在我遇到了另一个与使用segue相关的问题,并且在单击我的tableview单元格时从我的firebase数据库检索正确的数据。在过去,我已经用detailViewControllers成功地创建了几个swift和objective-c的tableviews,但这是我第一次使用firebase。 预先感谢您:) 这里我下面我通过我的代码在Xcode:如何通过点击tableviewcell特定的Firebase数据到视图控制器来接收?
主要泰伯维: 进口的UIKit 进口火力地堡 进口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 - '?字符串'
无法指定类型的值 '[字符串]' 到类型
而我detailViewController 除了BarName,BarAddress和BarMainImage - 我想包括短杆信息和开放时间。
进口的UIKit 进口火力地堡 进口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 == "" {
}
}
}
我的火力地堡数据库树: enter image description here
以下是解决您遇到的问题的一种方法。首先,它是最好使用一个变量来保存你在表中显示的对象的集合:即
// 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]
}
在segueing,您可以将其注入到你的detailsVC
像这样:
details.selectedBar = selectedBar
你已经完成selectedBar
对象夸大你的用户界面,而不是只是一个String
。
样本添加:我创建了一个具有所需功能的样本。拉代码时执行吊舱安装。这里是我的数据库是什么样子:
我已经添加了解决该问题的代码。 –
不幸的是我真的没有得到结构)尝试了几种方法,但我仍然会得到一个错误) – didayo