2016-12-31 123 views
0

早上好。我一直在爲我的一些老師朋友構建一個應用程序,但我在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) 
      } 

     }) 

    } 
+0

你能檢查你的Firebase結構嗎?學生節點看起來有點過分。我想你會有一個學生節點,其中包含由childByAutoId生成的密鑰的子節點,以及這些節點的子節點都是具有學生信息的特定學生。驗證節點中的數據和學生節點之間似乎也存在斷開連接。 – Jay

+0

@Frank也許我寫錯了。我會再做一次。無論如何,它看起來像是想與一個MS Access數據結構比較,有不同的關係表。第一個是學生,有他們的個人資料;和其他驗證 - 例如 - 具有來自特定驗證的數據。還有一些其他的。 Students節點直接連接到根節點,我認爲它不會改變我需要檢索imageURL的方式。我在我的檢索快照中。我只是不能使它成爲一個字符串。我猜。 –

+0

我不知道這是否是最好的方法,但我做到了:1)我已經定義了一個全局變量來捕獲URL的字符串,用於任何視圖控制器:'var ImagemURL_G:String?'。 2)在struct「Students」裏面,我設置了這個變量來捕獲剛好在它下面的字符串:'ImagemURL_G = imageURL'。 3)我重寫了LoadStudent方法。我將在主要問題之後將其作爲更新發布。 –

回答

0

我不知道這是不是最好的方式,但我已經找到一種方法

1 )我已經定義了一個全局變量來捕獲URL的字符串,用於任何視圖控制器:var ImagemURL_G: String?

2)裏面的結構「學生」,我已經設置了這個變量來捕獲剛好在快照下面的字符串:ImagemURL_G = imageURL。 ImageURL是數組的組成部分之一,所以我嘗試在這裏捕獲字符串,之後數組僅填充一個學生,我已經在LoadStudent方法中定義了:queryEqual(toValue: nomeIns)

3)我已經重寫了LoadStudent方法使用結構「Students」中捕獲的這個字符串並將NSData轉換回UIImage。

它工作。如果有人能以更好更簡單的方式做到這一點,我很高興看到它在這裏出版。我想這不是最好的方式,但對於我在Swift 3和Firebase中的經驗水平來說,這將是一段時間。