Swift 3数据从主控制器到具有Firebase和segue的控制器

时间:2017-05-29 18:52:36

标签: uitableview firebase swift3 firebase-realtime-database segue

我是ios dev的新手,我正在尝试开发我的第一款应用! :) 到现在为止还挺好... 现在我试图将数据从主控制器传递到项目详细信息视图。

似乎我无法弄清楚我做错了什么,但我一直收到错误: "致命错误:在展开可选值"

时意外发现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)!
        }
    }

在My 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
}

可能我只是做了一些愚蠢的错误...... :)但它是我的第一个应用程序而且我真的不知道如何解决这个问题!

如果有人能提供帮助,那将非常感激! :)

谢谢! 干杯!

更新: 我认为我的问题是因为形象。 我有一个网址,我以这种方式从firebase中回复:

   let url = analysisList[indexPath.row].immagine

然后我下载异步图像:

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

在segue中我这样做:

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

并在我的DetailVC中:

 var immagine: UIImage!
 imageDetail.image = immagine

这是错误的屏幕 enter image description here

1 个答案:

答案 0 :(得分:0)

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

设置顶级变量:

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!