【问题标题】:Swift 3 Data from main Controller to view controller with Firebase and segueSwift 3 数据从主控制器到带有 Firebase 和 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

【问题讨论】:

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

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


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2017-02-11
相关资源
最近更新 更多