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

Posted

技术标签:

【中文标题】Swift 3 数据从主控制器到带有 Firebase 和 segue 的视图控制器【英文标题】:Swift 3 Data from main Controller to view controller with Firebase and segue 【发布时间】:2017-05-29 18:52:35 【问题描述】:

我是 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)!
        
    

在我的 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 检索的 url:

   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

【问题讨论】:

Passing Data between View Controllers的可能重复 您能否更具体地说明是哪一行出现了该错误?如果您不知道,只需在代码中添加一个断点,然后逐行执行,直到它崩溃。 看来我的图像有问题...我在 firebase 中有一个 url,我检索了它,但似乎我无法通过它...它给了我发现错误为零 它给了我这一行的错误:tableView.delegate = self viewDidLoad 可能在您设置destination.analysisNew = label 之前被调用,我建议这样做,而不是在您传入新的analysisNew 时更新标签的功能@ 即func setAnalysisNew(_ analysisNew: <what ever>) crossLabel.text = analysisNew.valuta 【参考方案1】:

看到最近在视图之间传递变量。我能够通过首先将值设置为***变量(选择行时),然后在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!

【讨论】:

谢谢大家!解决了!这实际上是我的全部错误......代码正在运行......我忘记了在测试期间我已经更改了 ItemDetailVC 的声明,它不是 UIviewController......我是哑巴! :D

以上是关于Swift 3 数据从主控制器到带有 Firebase 和 segue 的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SWrevaelviewController swift 3 将数据从 tableview 的特定行传递到另一个视图控制器

如何在swift中最初打开一个表视图到选定的详细视图

Swift 3:将数据从 TabBarController 传递到子视图控制器

使用 SwiftUI 在 WatchOS 中实现从主控制器导航到基于页面的控制器的问题

如何在不调用 [关闭] 的情况下将整数从控制器设置到子视图

将数据从容器视图中的 tableview 中的静态单元格发送到 Swift 中的视图控制器