早上好。我一直在爲我的一些老師朋友構建一個應用程序,但我在Swift 3編程方面是新手,在Firebase編程方面更多,但我正在嘗試和學習很多東西。在發佈之前,我也在網上做了大量的研究,但大多數已經過時或者沒有專門針對這個問題。所以我希望有人能幫助我。我在Firebase有一些數據,我可以按照我想要的方式將它們顯示在表格視圖控制器中。當我想要看到關於一行的更多細節時 - 我有關於學生驗證的一些信息(每個學生的每行) - 單擊該單元格,然後我有一個具有這些細節的新視圖控制器(詳細視圖控制器)。我無法檢索,是學生(圖像URL)的照片,那是正確存儲在火力地堡,但在另一個節點:檢索數據:Firebase和Swift 3問題
---root
---2017FirstSemester
--validationA
-- key: -Kwteywgwueyuye
-- name: Paul Newman
-- note: 9,0
-- date: 12/12/2016
-- teacher: Anne
-- key: -Kwieiwe86he
-- name: Barbara Eden
-- note: 7,9
-- date: 12/12/2016
-- teacher: Mark
-- (…)
-- (…)
-- Students
-- key: -KweewojPaulNewman
-- name: Paul Newman
-- imageURL: 「https://firebasestorage.googleapis.com/…」
(UPDATED)
這是部分代碼:
import Foundation
import Firebase
/// UPDATED SOLUTUON
var ImagemURL_G: String?
struct Students {
var name: String?
var imageURL: String?
var key: String!
init(name: String, key: String = "", imageURL: String) {
self.name = name
self.imageURL = imageURL
self.key = key
}
init(snapshot: FIRDataSnapshot) {
key = snapshot.key
let snapshotValue = snapshot.value as! [String: AnyObject]
name = snapshotValue["name"] as? String
imageURL = snapshotValue["imageURL"] as? String
/// UPDATED SOLUTUON
ImagemURL_G: = imagemURL
}
func toAnyObject() -> Any {
return [
"name": name,
"userKey": key,
"imageURL": imageURL
]
}
}
詳細視圖控制器:
import Foundation
import UIKit
import Firebase
class DetailStudent: UIViewController {
var DescFB: Students!
@IBOutlet weak var imgPhoto: UIImageView!
@IBOutlet weak var labelStudentName: UILabel!
@IBOutlet weak var labelTeacher: UILabel!
@IBOutlet weak var labelNote: UILabel!
@IBOutlet weak var labelDate: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
labelStudentName.text = DescFB.name
labelTeacher.text = DescFB.teacher
labelNote.text = DescFB.note
labelDate.text = DescFB.date
LoadStudent()
}
func LoadStudent() {
let nameIns = labelStudentName.text
let ref = FIRDatabase.database().reference().child("2017FirstSemester ").child(「validationA」)
let db = ref.queryOrdered(byChild: "name").queryEqual(toValue: nomeIns)
db.observe(.value, with: { (snapshot) in
for snap in snapshot.children {
print("userKey: \((snap as! FIRDataSnapshot).key)")
self.labelKeyResult.text = (snap as! FIRDataSnapshot).key
print("PRINT SNAP: \(snap)")
}
})
}
當詳細信息視圖控制器負載,它加載驗證所有的價值,我嘗試使用學生姓名(由於透過SEGUE)來引用的新方法帶來ŧ來自「學生」節點的學生信息(信息名稱和圖像照片存儲在其他視圖控制器中用於其他驗證或其他目的),但是我可以檢索「關鍵」信息以在標籤中顯示目的。 「名稱」和「IMAGEURL」我能找到一種方法,看到他們在調試器窗口打印,如下所示:
userKey: -K_GiQwPXfR3AMvxyBat
PRINT SNAP: Snap (-K_GiQwPXfR3AMvxyBat) {
imageURL = "https://firebasestorage.googleapis.com/v0/b/chklist-5f5d3.appspot.com/o/https:%2Fchklist-...b36b3";
name = "PAUL NEWMAN";
userKey = "-K_GiQwPXfR3AMvxyBat";
}
我需要從「IMAGEURL」該字符串顯示在圖像視圖對象,這些照片和檢索該字符串是什麼,我不知道如何做到這一點:
var url = DescFB.imageURL
let url2 = NSURL(string: (url)!)
let data = NSData(contentsOf: (url2 as? URL)!)
imgPhoto.image = UIImage(data: data as! Data)
內部「FUNC LoadStudent」我已經嘗試了很多不同的方法和代碼並沒有什麼。我認爲這是非常接近正確的解決方案,但我看不到它。我希望有人能找到它並幫助我。非常感謝你和快樂2017
///更新:解決方案的一部分
func LoadStudent() {
let nomeIns = labelStudentName.text
var newTeste: [Students] = []
let db = refImagem.queryOrdered(byChild: "name").queryEqual(toValue: nomeIns)
db.observe(.value, with: { (snapshot) in
for resposta in snapshot.children {
let itemsAadicionar = Students(snapshot: resposta as! FIRDataSnapshot)
newTeste.append(itemsAadicionar)
}
self.AlunosAvaliados = newTeste
// It's here where the url receive URL string captured before
var url = ImagemURL_G
if url != nil{
let url2 = NSURL(string: (url)!)
let data = NSData(contentsOf: (url2 as? URL)!)
if data != nil {
self.imgPhoto.image = UIImage(data: data as! Data) }
}else{
url = "https://firebasestorage.googleapis.com/v0/b/chklist-5f5d3.appspot.com/o/imagesAlunos%2Fpessoa2.png?alt=media&token=e4b47dca-9dd0-444e-81d5-cf4cf122b94a"
let url2 = NSURL(string: (url)!)
let data = NSData(contentsOf: (url2 as? URL)!)
self.imgPhoto.image = UIImage(data: data as! Data)
}
})
}
你能檢查你的Firebase結構嗎?學生節點看起來有點過分。我想你會有一個學生節點,其中包含由childByAutoId生成的密鑰的子節點,以及這些節點的子節點都是具有學生信息的特定學生。驗證節點中的數據和學生節點之間似乎也存在斷開連接。 – Jay
@Frank也許我寫錯了。我會再做一次。無論如何,它看起來像是想與一個MS Access數據結構比較,有不同的關係表。第一個是學生,有他們的個人資料;和其他驗證 - 例如 - 具有來自特定驗證的數據。還有一些其他的。 Students節點直接連接到根節點,我認爲它不會改變我需要檢索imageURL的方式。我在我的檢索快照中。我只是不能使它成爲一個字符串。我猜。 –
我不知道這是否是最好的方法,但我做到了:1)我已經定義了一個全局變量來捕獲URL的字符串,用於任何視圖控制器:'var ImagemURL_G:String?'。 2)在struct「Students」裏面,我設置了這個變量來捕獲剛好在它下面的字符串:'ImagemURL_G = imageURL'。 3)我重寫了LoadStudent方法。我將在主要問題之後將其作爲更新發布。 –