如何从firebase数据库中检索url并通过UIButton(SWIFT)显示url?

Posted

技术标签:

【中文标题】如何从firebase数据库中检索url并通过UIButton(SWIFT)显示url?【英文标题】:How to retrieve url from firebase database and show url via UIButton (SWIFT)? 【发布时间】:2020-08-15 11:20:32 【问题描述】:

我正在尝试从 firebase 数据库中获取 pdf 的 URL,并通过 UIButton (ios) 将该 URL 显示为 PDF。 我正在尝试不同的方法,但我无法让它发挥作用。 任何帮助将不胜感激

      import UIKit

导入 SafariServices 导入 Firebase 数据库 导入 Firebase 导入 WebKit

类 ModelsInfoController: UIViewController , UIWebViewDelegate,UIScrollViewDelegate, WKUIDelegate var WKwebView: WKWebView! var dbRef:数据库参考! 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)。

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

【问题讨论】:

你能发布你当前的代码吗? @CongNguyen 我做到了,谢谢 show that URL as a PDF via UIButton 是什么意思? @CongNguyen 我想从数据库中获取 url,当按下按钮时显示该特定孩子的 pdf 你想用WKWebView来显示PDF内容对吧? 【参考方案1】:

代码存在一些问题,但主要问题是理解您使用 .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 观察到“模型”,则“模型”中的所有数据都已加载,并且没有直接子“url” - 直接子是 model_0、model_1 等

所以,如果你知道你想要的具体型号 url,改变 ref

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 以消除它们作为问题。请务必在测试后重置它们以保护您的数据。

【讨论】:

谢谢。知道为什么没有发生显示链接的操作吗? @levikoci 这是一个单独的问题。您需要先让 Firebase 部分正常工作。如我的答案所示,通过添加 print(url) 语句确保数据已加载并填充 var。一旦这样做了,其他问题就可以解决了。

以上是关于如何从firebase数据库中检索url并通过UIButton(SWIFT)显示url?的主要内容,如果未能解决你的问题,请参考以下文章

将图片从 URL 上传到 Firebase 存储

如何从 Firebase 实时数据库中检索/获取项目

如何从Firebase将单个图像URL串入我的flutter应用程序?

如果键仅返回 true,如何通过连接从 Firebase 数据库中检索数据?

为啥这不能检索 Firebase 存储上图像的下载 URL?

如何从firebase颤振中的文档中检索列表?