如何从Firebase数据库检索URL并通过UIButtonSWIFT显示URL?

问题描述

我正试图从firebase数据库获取pdf网址,并通过UIButton(iOS)将URL显示为PDF。 我正在尝试不同的方法,但无法正常工作。 任何帮助将不胜感激

      import UIKit

导入SafariServices 导入FirebaseDatabase 导入Firebase 导入WebKit

ModelsInfoController类:UIViewController,UIWebViewDelegate,uiscrollviewdelegate,WKUIDelegate { var WKwebView:WKWebView! var dbRef:DatabaseReference! var nextUrl =“ https://www.google.co.uk/”

let infoBttn: UIButton = {
    
    let infoBttn = UIButton (type: .system)
    infoBttn.setTitle("More Info",for: .normal)
    infoBttn.setTitleColor(#colorLiteral(red: 1,green: 1,blue: 1,alpha: 1),for: .normal)
    infoBttn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
    infoBttn.addTarget(self,action: #selector(retrieveUrl),for: .touchUpInside)
    return infoBttn

}()

  @objc  func retrieveUrl () {
       dbRef = Database.database().reference().child("models")
       dbRef.observe(.value) {
           (snapshot) in
           let value = snapshot.value as! NSDictionary
           let url = value["url"]!
           self.nextUrl = (url as! String)
        print (self.nextUrl)
           print ("webview is about to load")
        let request = URLRequest (url: URL(string: self.nextUrl)!)
           self.WKwebView.load(request)
           self.WKwebView.addobserver(self,forKeyPath: #keyPath(WKWebView.isLoading),options: .new,context: nil)
       }
       print ("function observe is called")
   }

我收到此错误

无法将类型'NSNull'(0x102d85dd0)的值强制转换为'NSDictionary'(0x102d856c8)

它没有从数据库获取正确的URL(对于不同的模型,URL存在不同的URL)。

我修复了该错误,但是当我按下按钮时仍然没有打开pdf。

解决方法

代码存在一些问题,但主要的问题是了解您使用.value检索的数据

您现在拥有的是这个

func retrieveUrl () {
   dbRef = Database.database().reference().child("models")
   dbRef.observe(.value) { (snapshot) in
      let value = snapshot.value as! NSDictionary

,问题在于“模型”包含其他子信息。您的结构可能是这样的:

models
   model_0
      url: "some url"
   model_1
      url: "another url"

如您所见,如果通过.value观察到'models',则将加载'models'中的所有数据,并且不存在直接子代'url'-直接子代为model_0,model_1等

因此,如果您知道所需的特定模型网址,请更改参考

let ref = your_firebase.child("models").child("model_1").child("url")
ref.observeSingleEvent.. { snapshot in
   let url = snapshot.value as? String ?? "No Url"
   print(url) //prints 'another url'

请注意,我也使用.observeSingleEvent而不是.observe。这是因为.observe在该节点上保留了一个观察者,如果有任何数据更改,并且在您看来不需要此用例的情况下,它将继续触发事件。

其他注意事项:

此行

print ("function observe is called")

将在从Firebase加载数据之前执行。代码比Internet快,因此Firebase数据仅在函数后的闭包后才有效-闭包后 的任何代码都将首先执行。

您可能还会遇到规则问题。对于测试,请确保将它们设置为true以消除它们的问题。请务必在测试后将其重置,以保护您的数据。