Доброе утро. Я создаю приложение для группы моих друзей-учителей, но я новичок в программировании Swift 3 и даже больше в Firebase, но я много и много разбираюсь. Я также провел обширные исследования в Интернете перед публикацией здесь, но большинство из них устарело или не связано конкретно с этим вопросом. поэтому я надеюсь, что кто-то может мне помочь. У меня есть данные в Firebase, и я могу показать их в контроллере табличного представления, как я хотел. Когда я хочу увидеть некоторые подробности об одной строке - где у меня есть информация о проверках ученика (каждая строка для каждого ученика) - я нажимаю на эту ячейку, и у меня есть новый контроллер представления с этими подробностями (контроллер подробных представлений). То, что я не могу получить, это фотография этого студента (URL изображения), что правильно хранится в Firebase, но в другом узле:Извлечение данных: Firebase and Swift 3 issue
---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
]
}
}
Detail View Controller:
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, разные таблицы, которые имеют отношения. Первый, учащийся, имеет свои персональные данные; и другие, валидацияА - например, - это данные от конкретной проверки. Есть и другие. Студенческий узел напрямую связан с корнем, и я думаю, что он не меняет способ получения изображенияURL. У меня есть это в моем снимке. Я просто не могу заставить его прийти к String. Я полагаю. –
Я не знаю, если это лучший способ, но я сделал это: 1) Я определил глобальную переменную, чтобы захватить строку для URL-адреса для любого контроллера вида: 'var ImagemURL_G: String?'. 2) Внутри структуры «Студенты» я установил эту переменную для захвата строки чуть ниже моментального снимка для нее: «ImagemURL_G = imageURL'. 3) Я переписал метод LoadStudent. Я опубликую его как обновление после основного вопроса. –