2016-12-31 3 views
0

Доброе утро. Я создаю приложение для группы моих друзей-учителей, но я новичок в программировании 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) 
      } 

     }) 

    } 
+0

Вы можете проверить свою структуру Firebase? Студенческий узел выглядит немного неуклюжим.Я бы подумал, что у вас будет узел «Студент» с детьми, у которых есть ключи, сгенерированные childByAutoId, и дети каждого из них являются конкретным учеником со своей студенческой информацией. Также существует разрыв между данными в узле проверки и узлом студента. – Jay

+0

@Frank, возможно, я написал это неправильно. Я сделаю это снова. Во всяком случае, похоже, что, сравнивая с структурой данных MS Access, разные таблицы, которые имеют отношения. Первый, учащийся, имеет свои персональные данные; и другие, валидацияА - например, - это данные от конкретной проверки. Есть и другие. Студенческий узел напрямую связан с корнем, и я думаю, что он не меняет способ получения изображенияURL. У меня есть это в моем снимке. Я просто не могу заставить его прийти к String. Я полагаю. –

+0

Я не знаю, если это лучший способ, но я сделал это: 1) Я определил глобальную переменную, чтобы захватить строку для URL-адреса для любого контроллера вида: 'var ImagemURL_G: String?'. 2) Внутри структуры «Студенты» я установил эту переменную для захвата строки чуть ниже моментального снимка для нее: «ImagemURL_G = imageURL'. 3) Я переписал метод LoadStudent. Я опубликую его как обновление после основного вопроса. –

ответ

0

Я не знаю, если это лучший способ, но я нашел один способ

1) Я определил глобальную переменную для захвата строки для URL-адреса для любого контроллера вида: var ImagemURL_G: String?.

2) Внутри структуры «Студенты» я установил эту переменную для захвата строки чуть ниже моментального снимка для нее: ImagemURL_G = imageURL. ImageURL является одним из компонентов массива, поэтому я попытался захватить строку здесь, после того, как массив был заполнен только одним учеником, который я определил внутри метода LoadStudent: queryEqual(toValue: nomeIns)

3) Я переписал метод LoadStudent использовать эту строку, захваченную внутри структуры «Студенты», и преобразовать NSData обратно в UIImage.

Это сработало. Если кто-то может сделать это лучше и проще, я ценю его публикацию здесь. Думаю, это не самый лучший способ, но для моего уровня опыта в Swift 3 и Firebase это будет один, пока.

Смежные вопросы