【问题标题】:Error while receiving image array from the Child's folder Firebase Swift从子文件夹 Firebase Swift 接收图像数组时出错
【发布时间】:2017-08-16 06:05:46
【问题描述】:

我目前正在尝试从我的 Child 文件夹接收带有标题的图像数组到另一个通过 detailViewController 的按钮连接的 offertableview,但不幸的是,我一直收到错误消息。下面我附上了我的 firebase 数据结构的图片和我的 mainstoryboard 屏幕截图。

对于第一个表视图,我有一个餐厅列表,在选择一个单元格后,它会传输到详细视图控制器,其中列出了餐厅的所有详细信息(为此我已经创建了我的餐厅的模型) detailVC 我有一个连接到 offertableview 的按钮,其中列出了该特定餐厅的所有优惠。

当我点击按钮时,它会转移到报价表视图,导致应用程序由于错误而关闭。

我的优惠表格查看代码:

var ref: DatabaseReference!
var offerImageArray = [String]()
var titleArray = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    fetchBars()
}

func fetchBars(){

    ref.child("Paris").observeSingleEvent(of: .value, with: { (snapshot) in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let imageSnap = snap.childSnapshot(forPath: "offers")
            let dict = imageSnap.value as! [String: Any]
            let imageUrl = dict["offer_image"] as? String
            let titleUrl = dict["offer_title"] as? String
            self.offerImageArray = [imageUrl! as String]
            self.titleArray = [titleUrl! as String]
        }
    })
        self.tableView.reloadData()
}

覆盖 func numberOfSections(in tableView: UITableView) -> Int { 返回 1 }

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return offerImageArray.count
}

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

    cell.offerImageView.sd_setImage(with: URL(string: self.offerImageArray[indexPath.row]))
    cell.titleLabel.text = titleArray[indexPath.row]
           return cell
}

Xcode 错误:

2017-08-16 10:26:33.652 申请[1174] [Firebase/Analytics][I-ACS003007] 成功创建 Firebase 分析应用程序自动委托代理。要禁用代理,请设置 Info.plist 中的 FirebaseAppDelegateProxyEnabled 标志为 NO 2017-08-16 10:26:33.826 申请[1174] [Firebase/Analytics][I-ACS032003] iAd 框架未链接。搜索 广告归因报告器已禁用。 2017-08-16 10:26:33.828 应用[1174] [Firebase/分析][I-ACS023012] Firebase 分析启用致命错误:展开时意外发现 nil 一个可选值

【问题讨论】:

  • 在 for 循环之前添加 print(snapshot) 看看你得到了什么?
  • 问题在循环中,您正在使用可以共享项目文件吗?所以我可以尝试更正你在这里使用的 for 循环
  • @user1000 我不断收到同样的信息 :(
  • 请评论for循环,然后告诉我打印结果(快照)

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


【解决方案1】:
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import SDWebImage


class OffersTableVC: UITableViewController {
    var ref: DatabaseReference!
   var offerImageArray = [String]()
    var titleArray = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchBars()
    }

    func fetchBars(){

        Database.database().reference().child("paris").observeSingleEvent(of: .value, with: { (snapshot) in

            print("Main Snapshot is \(snapshot)")

            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let imageSnap = snap.childSnapshot(forPath: "offers")



                if let snapDict = imageSnap.value as? [String:AnyObject] {
                    let dictKeys = [String](snapDict.keys)
                    print(dictKeys)
                    let dictValues = [AnyObject](snapDict.values)
                    print(dictValues)


                    for each in dictValues{
                        let imageUrl = each["offer_image"] as? String
                        print(imageUrl!)
                        self.offerImageArray.append(imageUrl!)

                    }
                    self.tableView.dataSource = self
                    self.tableView.delegate = self
                    self.tableView.reloadData()

                }





//                let dict = imageSnap.value as! [String: Any]
//                let imageUrl = dict["offer_image"] as? String
//                let titleUrl = dict["offer_title"] as? String
//                self.offerImageArray = [imageUrl! as String]
//                self.titleArray = [titleUrl! as String]
            }
        })

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return offerImageArray.count
    }

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

        cell.offerImageView.sd_setImage(with: URL(string: self.offerImageArray[indexPath.row]))
//        cell.titleLabel.text = titleArray[indexPath.row]
               return cell
    }

}

【讨论】:

  • 再次非常感谢您)但我也有一个帮助)请您删除我的名字在所有代码之上吗? )
  • 完成了 :) 抱歉
  • 非常感谢你:)
  • 乐于帮助:)
  • 嘿)我发现了一个大问题:(基本上,当我在 tableview 控制器中按下一个 Bar 的报价时,它会显示所有报价,包括另一个 bar 的报价:/ 例如黑色和黄色条报价是第二个酒吧的报价,带有汤和砧板的图片是第一个酒吧的图片:(如果您能帮助我,我将不胜感激)
【解决方案2】:

1) 在 Appdelegate.swift 中添加 selectedBarname 如下

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var selectedBarName = String()

2) MainTableVc 添加如下代码

类声明后

let appDelegate = UIApplication.shared.delegate as! AppDelegate

在prepareForSegue中

if segue.identifier == "DetailView", let bar = selectedBar{
            appDelegate.selectedBarName = bar.barName

3) OfferTableVc

现在只需调用此函数并完成,但不要调用您的 fetchBars 现在只需 getOffers

func getOffers() {
    let databaseRef = Database.database().reference().child("aktau")
        databaseRef.queryOrdered(byChild: "bar_name").queryEqual(toValue: self.appDelegate.selectedBarName).observe(.value, with: { snapshot in

        if ( snapshot.value is NSNull ) {
            print("not found)")

        } else {
            print(snapshot.value!)
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let imageSnap = snap.childSnapshot(forPath: "offers")
                if let snapDict = imageSnap.value as? [String:AnyObject] {

                    let dictValues = [AnyObject](snapDict.values)


                    for each in dictValues{
                        let imageUrl = each["offer_image"] as? String
                        print(imageUrl!)
                        self.offerImageArray.append(imageUrl!)

                    }
                    self.tableView.dataSource = self
                    self.tableView.delegate = self
                    self.tableView.reloadData()

                }

            }


        }
    })
}

【讨论】:

  • 它的工作) Thaaank 你非常感谢你的帮助:) 你救了我)
  • 欢迎,乐于帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2020-06-14
  • 1970-01-01
相关资源
最近更新 更多