如何从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?的主要内容,如果未能解决你的问题,请参考以下文章
如何从Firebase将单个图像URL串入我的flutter应用程序?
如果键仅返回 true,如何通过连接从 Firebase 数据库中检索数据?