2017-05-29 98 views
0

我是新來的ios dev,我正在嘗試開發我的第一個應用程序! :) 到目前爲止這麼好... 現在我試圖將數據從主控制器傳遞到項目詳細信息視圖。Swift 3從主控制器到Firebase和Segue的視圖控制器的數據

我似乎無法找出什麼我做錯了,但我不斷收到一個錯誤: 「致命錯誤:意外發現零而展開的可選值」

現在我明白該值不分配,但我不明白爲什麼 ...這裏是我的代碼:

-------> MainVC 

    struct Ananlysys { 
    var descrizione: String! 
    var data: String! 
    var immagine: String! 
    var seganle: String! 
    var oraUpload: String! 
    var valuta: String! 
} 

var analysisList = [Ananlysys]() 

var alertsRef = FIRDatabase.database().reference().child("analisi") 

override func viewDidLoad() { 
    super.viewDidLoad() 

    fetchDataFromDB()   
} 

func fetchDataFromDB(){ 
    alertsRef.observe(.childAdded, with: { snapshot in 

     if let dict = snapshot.value as? [String: AnyObject] { 
      let descrizione = dict["descrizione"] as! String 
      let data = dict["data"] as! String 
      let stato = dict["stato"] as! String 
      let immagine = dict["imageURL"] as! String 
      let seganle = dict["segnale"] as! String 
      let oraUpload = dict["oraupload"] as! String 
      let valuta = dict["valuta"] as! String 

      self.analysisList.insert(Ananlysys(descrizione: descrizione, 
        data:data, immagine:immagine, seganle: seganle, oraUpload: oraUpload, 
        valuta: valuta), at: 0) 
      self.tableView.reloadData() 
     } 
    }) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ItemDetailVC"{ 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      let destination = segue.destination as! ItemDetailVC 
      let cell = tableView.cellForRow(at: indexPath) as? ItemCell 
      destination.valuta = (cell?.valutaLabel.text)! 
      destination.segnale = (cell?.signalLabel.text)! 
      destination.desc = (cell?.descriptionLabel.text)! 
      destination.immagine = (cell?.imageThumb.image)! 
     } 
    } 

在我ItemDetailsVC控制器(也就是目標)我剛剛創建的IBOutlet中。這裏的代碼:

class ItemDetailVC: OpenAlertsVC { 

    @IBOutlet weak var crossLabel: UILabel! 
    @IBOutlet weak var signalLbl: UILabel! 
    @IBOutlet weak var imageDetail: UIImageView! 
    @IBOutlet weak var analysisDesc: UILabel! 

    var valuta = "" 
    var segnale = "" 
    var immagine: UIImage! 
    var desc = "" 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
     crossLabel.text = valuta 
     signalLbl.text = segnale 
     analysisDesc.text = desc 
     imageDetail.image = immagine 
} 

也許我只是做了一些愚蠢的錯誤... :)但它是我的第一個應用程序,我真的不知道怎麼算出這個!

如果有人能幫助,那將是非常感激! :)

謝謝! 乾杯!

更新: 我認爲我的問題是因爲圖像。 我有我從火力retrive這樣的URL:在SEGUE

cell.imageThumb.downloadImageFrom(link: url!, contentMode: 
    UIViewContentMode.scaleToFill) 

我這樣做::

let url = analysisList[indexPath.row].immagine 

,然後我下載異步圖像

destination.immagine = (cell?.imageThumb.image)! 

並在我的DetailVC中:

var immagine: UIImage! 
imageDetail.image = immagine 

這是錯誤的屏幕 enter image description here

+0

[查看控制器之間傳遞數據]的可能的複製(HTTPS ://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – Chris

+0

你可以更具體一點,哪些線是給你的錯誤?如果您不知道,只需在您的代碼中添加一個斷點,然後逐行瀏覽它,直至崩潰。 – Jay

+0

它似乎是我有圖像的問題...我有一個在firebase中的網址,我檢索,但它似乎我不能通過它...它給了我錯誤發現無 – Marco

回答

0

查看視圖之間最近傳遞的變量。通過首先將該值設置爲頂層變量(選中某行時),然後在segue prepare功能期間重新引用該變量,我能夠讓它們移動。希望這可以幫助。

設置一個最高級別的變量:

var valuta: String! 

突圍self.tableView.indexPathForSelectedRow部分到它自己的代表。本教程是一個很好的例子。 (http://shrikar.com/swift-ios-tutorial-uisearchbar-and-uisearchbardelegate

使用「didSelectRowAt indexPath」委託,設置頂級變量值。

func tableView(_ tableView: UITableView, didSelectRowAt IndexPath: IndexPath){ 
    let cell = tableView.cellForRow(at: indexPath)! 
    valuta = cell?.valutaLabel.text 
} 

樣本調整,準備功能:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){ 
    if segue.identifier == "ItemDetailVC"{ 
     if let destination = 
      segue.destination as? name_of_your_next_view_controller { 
       destination.passedValuta = valuta 
    } 
} 

確保把接收變量的下一個視圖

var passedValuta: String! 
+0

謝謝你們!解決了!這實際上是我所有的壞...代碼工作...我忘記了在測試期間我已經改變了ItemDetailVC的聲明,它不是一個UIviewController ....我笨! :d – Marco

相關問題