2017-07-27 1 views
0

Je construis une application rapide grâce à l'utilisation de Firebase, dans ma base de données Firebase J'ai des restaurants (childs) avec l'information. J'ai réussi à intégrer Firebase à mon projet et à remplir mon tableview avec des données Firebase avec des images grâce à l'utilisation de SDWebImage. Cependant maintenant je suis coincé avec d'autres questions concernant l'utilisation de segue et la récupération des données correctes de ma base de données Firebase en cliquant sur ma cellule de table. Dans le passé, j'ai réussi à construire plusieurs vues de table rapide et objective-c avec detailViewControllers, mais c'est ma première expérience avec firebase. Merci d'avance :) Ci-dessous je me passe mes codes de Xcode:Comment recevoir des données Firebase spécifiques au viewcontroller en cliquant sur tableviewcell?

principal Tableview: importation UIKit importation Firebase importation FirebaseAuth importation FirebaseDatabase importation FirebaseStorage importation SDWebImage

classe 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 


} 

}} problème avec barName - '? String'

Impossible d'affecter la valeur de type '[chaîne]' taper

Et mon detailViewController En plus de la BarName, BarAddress et BarMainImage - je voudrais inclure des informations à court bar et le temps d'ouverture.

importation UIKit importation Firebase importation FirebaseAuth importation FirebaseDatabase importation FirebaseStorage importation SDWebImage

classe 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 == "" { 

    } 

} 

}

Mon Firebase Base de données Arbre: enter image description here

Répondre

1

Voici une façon de résoudre le problème auquel vous êtes confronté. Tout d'abord, il est préférable d'utiliser une seule variable pour tenir votre collection d'objets vous affichez dans le tableau: à savoir

// Define your model 
struct Bar { 
    var name: String 
    var image: String 
    var address: String 
} 

// Change your variables 
var bars = [Bar]() 
var selectedBar: Bar? 

Deuxièmement, vous auriez besoin d'obtenir un seul objet bar sur la sélection de cellules. à savoir

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 
    selectedBar = bars[indexPath.row]   
} 

Sur segueing, vous pouvez l'injecter à votre detailsVC comme ceci:

details.selectedBar = selectedBar 

Vous avez complet objet selectedBar pour gonfler votre interface utilisateur au lieu d'un String.

Exemple d'ajout: J'ai créé un exemple qui exécute les fonctionnalités requises. Effectuez l'installation du pod en même temps que le code. Voici ce que ma base de données ressemble:

enter image description here

Repository:https://github.com/HassanSE/FirebaseSample

+0

s'il est possible peut vous montrer exemple complet de code) J'ai un problème quand je suis ecrivais barres var = [bar] () var selectedBar: Barre? – didayo

+0

J'ai ajouté le code pour résoudre ce problème. –

+0

Malheureusement, je n'ai pas vraiment la structure) J'ai essayé plusieurs façons, mais je aurais toujours une erreur) – didayo