Swift 3从主控制器到Firebase和Segue的视图控制器的数据

问题描述:

我是新来的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

查看视图之间最近传递的变量。通过首先将该值设置为顶层变量(选中某行时),然后在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