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 = selfviewDidLoad
可能在您设置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 3:将数据从 TabBarController 传递到子视图控制器