如何解决如何从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以消除它们的问题。请务必在测试后将其重置,以保护您的数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。