Uitableview 从主控制器到带Firebase和segue的视图控制器的Swift 3数据

Uitableview 从主控制器到带Firebase和segue的视图控制器的Swift 3数据,uitableview,firebase,swift3,firebase-realtime-database,segue,Uitableview,Firebase,Swift3,Firebase Realtime Database,Segue,我是ios开发者的新手,我正在尝试开发我的第一个应用程序!:) 到现在为止,一直都还不错。。。 现在我正试图将数据从主控制器传递到ItemDetails视图 似乎我不知道自己做错了什么,但我不断地出错: “致命错误:在展开可选值时意外发现nil” 现在我知道这个值没有赋值,但我不明白为什么。。。 这是我的密码: -------> MainVC struct Ananlysys { var descrizione: String! var data: String

我是ios开发者的新手,我正在尝试开发我的第一个应用程序!:) 到现在为止,一直都还不错。。。 现在我正试图将数据从主控制器传递到ItemDetails视图

似乎我不知道自己做错了什么,但我不断地出错: “致命错误:在展开可选值时意外发现nil”

现在我知道这个值没有赋值,但我不明白为什么。。。 这是我的密码:

 -------> 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
}
也许我只是犯了些愚蠢的错误……:)但这是我的第一个应用程序,我真的不知道如何解决这个问题

如果有人能帮忙,我将不胜感激

谢谢大家!! 干杯

更新: 我想我的问题是因为形象。 我有一个url,通过以下方式从firebase检索:

   let url = analysisList[indexPath.row].immagine
然后我下载了异步图像:

   cell.imageThumb.downloadImageFrom(link: url!, contentMode: 
    UIViewContentMode.scaleToFill)
在segue中,我会这样做:

   destination.immagine = (cell?.imageThumb.image)!
在我的详细介绍中:

 var immagine: UIImage!
 imageDetail.image = immagine
这是错误的屏幕

最近看到了在视图之间传递变量的情况。我能够通过首先将值设置为顶级变量(当选择一行时),然后在segue prepare函数期间重新引用该变量来移动它们。希望这有帮助

设置顶级变量:

var valuta: String!
将self.tableView.indexPathForSelectedRow部分拆分为它自己的委托。本教程是一个很好的例子。()

使用“DidSelectRowatIndeXPath”委托,设置顶级变量值

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!

你能不能更具体一点,哪一行给了你这个错误?如果您不知道,只需在代码中添加一个断点,然后一行一行地遍历它,直到崩溃。似乎我的图像有问题…我在firebase中有一个url,我检索到了它,但似乎无法传递它。。。它给了我找到的错误。它给了我这一行的错误:tableView.delegate=self
viewDidLoad
可能在您设置
destination.analysisNew=label
之前被调用。我建议您这样做,而不是在传入一个新的
analysisNew
时使用一个更新标签的函数
func setAnalysisNew(analysisNew:){crossLabel.text=analysisNew.valuta}
谢谢大家!解决了!其实都是我的错。。。代码正在运行。。。我忘了在一次测试中,我更改了ItemDetailVC的声明,它不是UIviewController。。。。我是笨蛋D