【发布时间】:2021-02-15 14:52:54
【问题描述】:
我不断收到一个致命错误,说明一个值是如何解包的,它是 nil,我不明白如何解包。当我用特定变量实例化视图控制器时,它们都会显示出来,但是当我对确切的 VC 执行 segue 时,值不会显示出来。
以这些函数为例...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let displayVC = storyboard?.instantiateViewController(withIdentifier: Constants.Storyboards.TeachStoryboardID) as? SchoolEventDetailsViewController {
displayVC.selectedEventName = events[indexPath.row].eventName
displayVC.selectedEventDate = documentsDate[indexPath.row].eventDate
displayVC.selectedEventCost = documentsCost[indexPath.row].eventCost
displayVC.selectedEventGrade = documentsGrade[indexPath.row].eventGrade
displayVC.selectedEventDocID = documentsID[indexPath.row]?.docID
navigationController?.pushViewController(displayVC, animated: true)
}
}
结合这个功能:
func verifyInstantiation() {
if let dateToLoad = selectedEventDate {
dateEditableTextF.text = dateToLoad
}
if let costToLoad = selectedEventCost {
costEditableTextF.text = costToLoad
}
if let gradesToLoad = selectedEventGrade {
gradesEditableTextF.text = gradesToLoad
}
if let docIDtoLoad = selectedEventDocID {
docIDUneditableTextF.text = docIDtoLoad
}
if let eventNameToLoad = selectedEventName {
eventNameEditableTextF.text = eventNameToLoad
}
}
帮助完美加载数据,但是当我尝试从搜索控制器执行 segue 时,数据不存在。
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = selectedEventName
我将 vc 的标题设置为事件名称,并且我最近还添加了一个文本字段来存储它以用于实验目的(这个问题)。
现在的问题是我想从 Algolia 搜索控制器向该 VC 进行数据传输,我得到了所有其他字段来显示,除了一个是文档 ID。所以我创建了一个完成处理函数,将文档 ID 作为字符串获取,并在执行 segue 时将其插入到 vc 中,就像实例化 vc 时一样。
这里是函数:
func getTheEventDocID(completion: @escaping ((String?) -> ())) {
documentListener = db.collection(Constants.Firebase.schoolCollectionName).whereField("event_name", isEqualTo: selectedEventName ?? navigationItem.title).addSnapshotListener(includeMetadataChanges: true) { (querySnapshot, error) in
if let error = error {
print("There was an error fetching the documents: \(error)")
} else {
self.documentsID = querySnapshot!.documents.map { document in
return EventDocID(docID: (document.documentID) as! String)
}
let fixedID = "\(self.documentsID)"
let substrings = fixedID.dropFirst(22).dropLast(3)
let realString = String(substrings)
completion(realString)
}
}
}
我认为selectedEventName 或navigationItem.title 将完成工作并在我现在将展示的数据传输函数中使用该函数时提供值:
//MARK: - Data Transfer From Algolia Search to School Event Details
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
otherVC.getTheEventDocID { (eventdocid) in
if let id = eventdocid {
if segue.identifier == Constants.Segues.fromSearchToSchoolEventDetails {
let vc = segue.destination as! SchoolEventDetailsViewController
vc.selectedEventName = self.nameTheEvent
vc.selectedEventDate = self.dateTheEvent
vc.selectedEventCost = self.costTheEvent
vc.selectedEventGrade = self.gradeTheEvent
vc.selectedEventDocID = id
}
}
}
}
但是当点击搜索结果时它最终什么也没有显示,这非常令人沮丧,我不明白为什么当我在SchoolEventDetailsVC 中声明它们时它们都是空值。我试图强制打开 selectedEventName 并崩溃说有一个 nil 值,我不知道为什么。这个问题实际上还有很多,但我只是尽量保持简短,以便人们真正尝试阅读它并提供帮助,因为没有人阅读我发布的问题,所以是的,提前谢谢。
【问题讨论】:
-
getTheEventDocID是做什么的?如果它是异步工作的,可能是代码执行得太晚了。 -
getTheEventDocID获取 Firebase 生成的事件文档 ID 作为字符串。它确实是异步工作的,有没有办法防止代码执行得太晚? @AndreasOetjen
标签: swift uiviewcontroller segue instantiation uistoryboardsegue