【发布时间】:2019-03-15 17:44:19
【问题描述】:
因此,每次我在 addItemViewController 中向 Firebase 添加一个新条目时,它都会返回到 ViewController,但是在执行此操作时应用程序崩溃并出现以下错误: “线程 1:致命错误:在展开可选值时意外发现 nil”。 错误出现在 ViewDidLoad 中的 ViewController.swift 中,带有 tableView.reloadData()。我们欢迎所有的建议!谢谢!
ViewController.swift
//
// ViewController.swift
// toDo
//
// Created by Jesse Brior on 10/5/18.
// Copyright © 2018 Jesse Brior. All rights reserved.
//
import UIKit
import Firebase
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var ref : DatabaseReference!
var items: [itemObjectModel] = []
override func viewDidLoad() {
super.viewDidLoad()
ref = Database.database().reference()
tableView.reloadData()
self.navigationItem.setHidesBackButton(true, animated: true)
self.title = "To Do's"
storeKeys()
}
func storeKeys() {
ref.child("tasks").queryOrdered(byChild: "completed").observe(.value, with: { snapshot in
var newItems: [itemObjectModel] = []
for child in snapshot.children {
if let snapshot = child as? DataSnapshot,
let newTask = itemObjectModel(snapshot: snapshot) {
newItems.append(newTask)
self.items = newItems
self.tableView.reloadData()
}
}
self.items = newItems
self.tableView.reloadData()
})
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let item = items[indexPath.row]
cell.textLabel?.text = item.name.capitalized
if item.completed {
cell.detailTextLabel?.text = "Complete"
}else{
cell.detailTextLabel?.text = "Incomplete"
}
return cell
}
}
addItemViewController.swift
//
// addItemController.swift
// toDo-v2
//
// Created by Jesse Brior on 10/9/18.
// Copyright © 2018 Jesse Brior. All rights reserved.
//
import Foundation
import UIKit
import Firebase
class addItemController: UIViewController {
var ref : DatabaseReference!
@IBOutlet weak var addItemField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
ref = Database.database().reference()
self.title = "Add Item"
}
@IBAction func addItemPressed(_ sender: Any) {
if addItemField.text != "" {
let task = addItemField.text!
let completion = false
let newItem = itemObjectModel(name: task, completed: completion)
let newItemRef = self.ref.child("tasks").child(task.lowercased())
newItemRef.setValue(newItem.toAnyObject())
}
self.present(ViewController(), animated: true, completion: nil)
}
}
崩溃日志图片链接:https://i.stack.imgur.com/ZGC4k.png
【问题讨论】:
-
设置异常断点以获取发生异常的实际行。最有可能的错误原因是
ViewController()的任意实例,它不是故事板中的实例。 -
在将数据实际添加到
items列表之前,为什么要在viewDidLoad中调用tableView.reloadData()?