2017-08-14 57 views
-1

我目前正在建立一个列出各种餐馆的项目。在我的项目中,我使用主表视图来显示餐馆列表,并在点击单元格时将其传递给视图控制器,该视图控制器显示有关餐厅的基本信息。在详细的视图控制器中有一个名为“Offers”的按钮,点击后会打开另一个tableview,显示该餐厅的一系列优惠信息。 (请看附图)检索孩子的文件夹数据Firebase Swift

现在我只能检索我的餐厅列表,详细显示详细的视图控制器,但我不知道如何显示每个餐厅的优惠清单。 请帮助我,并提前谢谢你。

代码: 餐厅/酒吧型号:

import Foundation 
import Firebase 
import FirebaseDatabase 

struct Bar{ 
    let id: String 
    let barName: String 
    let barAddress: String 
    let barMainImage: String 
    let barInfo: String 
    let barFullAddress: String 
    let averagePrice: String 

    let disabledIcon: String 
    let parkingIcon: String 
    let wifiIcon: String 
    let offerImage: String 

    static func bar(from snapshot: DataSnapshot) -> Bar?{ 
     let barDict = snapshot.value as? [String : AnyObject] ?? [:] 
     guard let barName = barDict["bar_name"] as? String, 
     let barAddress = barDict["bar_short_address"] as? String, 
     let barMainImage = barDict["bar_main_image"] as? String, 
     let barInfo = barDict["bar_info"] as? String, 
     let barFullAddress = barDict["bar_full_address"] as? String, 
     let averagePrice = barDict["average_price"] as? String, 

     let disabledIcon = barDict["disabled_icon"] as? String, 
     let parkingIcon = barDict["parking_icon"] as? String, 
     let wifiIcon = barDict["wifi_icon"] as? String, 
let offers = barDict["offers"] as? [String:Any], 
    let offerImage = offers["offer_image"] as? String, 
     let id = String(snapshot.key) 
     else {return nil} 
    let bar = Bar (id: id, barName: barName, barAddress: barAddress, barMainImage: barMainImage, barInfo: barInfo, barFullAddress: barFullAddress, averagePrice: averagePrice, disabledIcon: disabledIcon, parkingIcon: parkingIcon, wifiIcon : wifiIcon, offerImage: offerImage) 

    return bar 
} 

}

首先表视图控制器 - 列出所有的餐馆:

import UIKit 
import Firebase 
import FirebaseAuth 
import FirebaseDatabase 
import FirebaseStorage 
import SDWebImage 

class MainTableVC: UITableViewController { 


@IBOutlet weak var MenuBar: UIBarButtonItem! 

@IBOutlet weak var cityButton: UIButton! 

var ref: DatabaseReference! 
var bars = [Bar]() 
var selectedBar: Bar? 
var refreshTableView = UIRefreshControl() 
var selectedCity: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() 

    //back button title removal 
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil) 


    // SlideOutMenu 
    MenuBar.target = self.revealViewController() 
    MenuBar.action = #selector(SWRevealViewController.revealToggle(_:)) 
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 

    ref = Database.database().reference() 

    fetchBars() 
    // for pull to refresh 
    refreshTableView.tintColor = UIColor.white 
    self.tableView.addSubview(refreshTableView) 
    refreshTableView.addTarget(self, action: #selector(MainTableVC.refreshData), for: UIControlEvents.valueChanged) 


} 


// for pull to refress 
func refreshData() { 
    //removes data before updating and entering new one 
    self.bars.removeAll() 
    ref.child("Paris").observe(.childAdded, with: { (snapshot) in 
     guard let bar = Bar.bar(from: snapshot) else {return} 
     self.bars.append(bar) 
     self.refreshTableView.endRefreshing() 
     self.tableView.reloadData() 
    }) 
} 

func fetchBars(){ 

    ref.child("Paris").observe(.childAdded, with: { (snapshot) in 
     guard let bar = Bar.bar(from: snapshot) else {return} 
     self.bars.append(bar) 
     self.tableView.reloadData() 
    }) 
    self.refreshTableView.endRefreshing() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// 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 bars.count 
} 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "RestoCell", for: indexPath) as! ViewControllerCell 

    let bar = bars[indexPath.row] 
    cell.RestName.text = bar.barName 
    cell.RestAddress.text = bar.barAddress 
    cell.RestImage.sd_setImage(with: URL(string: bar.barMainImage)) 


    return cell 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    selectedBar = bars[indexPath.row] 
    performSegue(withIdentifier: "DetailView", sender: self) 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "DetailView", let bar = selectedBar{ 
     let detailVC = segue.destination as! DetailViewController 
     detailVC.selectedBar = bar 
    } 
} 

详细视图控制器 - 列出所有细节inf为每个餐厅准备:

import UIKit 
import Firebase 
import FirebaseAuth 
import FirebaseDatabase 
import FirebaseStorage 
import SDWebImage 

class 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 disabledIcon: UIImageView! 

@IBOutlet weak var parkingIcon: UIImageView! 

@IBOutlet weak var wifiIcon: UIImageView! 

@IBOutlet weak var OpeningHoursLabel: UILabel! 





@IBOutlet weak var ImageViewD: UIImageView! 

var selectedBar:Bar?

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 let bar = selectedBar{ 
     restName.text = bar.barName 
     ImageViewD.sd_setImage(with: URL(string: bar.barMainImage)) 
     InfoAboutRest.text = bar.barInfo 
     averagePrice.text = bar.averagePrice 
     FullAddressLabel.text = bar.barFullAddress 
     disabledIcon.sd_setImage(with: URL(string: bar.disabledIcon)) 
     parkingIcon.sd_setImage(with: URL(string: bar.parkingIcon)) 
     wifiIcon.sd_setImage(with: URL(string: bar.wifiIcon)) 

    } 

} 






/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

}

IMAGES

[火力地堡树] [1] [MainStoryBoard] [2]

OffersTableView: 


import UIKit 
import Firebase 
import FirebaseAuth 
import FirebaseDatabase 
import FirebaseStorage 
import SDWebImage 


class OffersTableVC: UITableViewController { 
var ref: DatabaseReference! 
var bars = [Bar]() 
var selectedBar: Bar? 

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() 
    fetchBars() 
} 
func fetchBars(){ 

    ref.child("aktau").observe(.childAdded, with: { (snapshot) in 
     guard let bar = Bar.bar(from: snapshot) else {return} 
     self.bars.append(bar) 
     self.tableView.reloadData() 
    }) 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// 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 1 
} 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "OfferCell", for: indexPath) as! OffersTableViewCell 

    let bar = bars[indexPath.row] 
    cell.offerImageView.sd_setImage(with: URL(string: bar.offerImage)) 
    return cell 
} 

错误在我的模型:

ModelError

+0

这个问题中代码完全太多了。答案可能很简单,但没有看到您的Firebase结构,这只是猜测。请将您的Firebase结构中的代码片段作为文本添加进去,不要包含图片(Firebase控制台 - >导出JSON),并将代码简化为一个简单示例。请花点时间回顾一下[我如何提出一个好问题?](https://stackoverflow.com/help/how-to-ask)和[如何创建一个最小,完整和可验证的示例](https:/ /stackoverflow.com/help/mcve)。清理它,我们会看看! – Jay

回答

0

必须解析 “报价” 像

let offers = barDict["offers"] as? [String:Any] 

然后你必须分析这个字典一样

var offersArray = [Offer]() 

    for item in offers { 

    guard let offerimage = item["offerImage"] as? String, ... { 
     var offer = Offer(offerimage) 
     offersArray.append(offer) 
    } 
} 


class Offer { 

let offerImageUrl:String 
// Other Properties 

    init(string: offerImageUrl){ 
    self.offerImageUrl = offerImageurl 
    //Other Properties 
    } 
} 

我希望你明白我的想法。现在你有一个数组与您的优惠:)

+0

我应该为这些优惠创建一个Struct吗?或者我应该在“let wifiIcon = barDict [”wifi_icon“] as?String,”之后直写“? – didayo

+0

直接后,Wifiicon很好 – Peiper

+0

我已更新我的代码与编辑),但不幸的是,它现在不显示任何东西)甚至我的餐厅列表)我不知道为什么) – didayo