因此,每当我在addItemViewController中向Firebase添加新条目时,它都会重新回到ViewController,但是这样做时,应用程序崩溃且出现此错误: “ 线程1:致命错误:在展开可选值时意外发现nil ”。 该错误在带有tableView.reloadData()的ViewDidLoad中的ViewController.swift中。我们欢迎所有的建议!谢谢!
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
答案 0 :(得分:0)
您在此行中出错:
self.present(ViewController(), animated: true, completion: nil)
这与您将其“返回”到您的ViewController
类中不同,但是它创建了它的新实例并将其呈现。同样,当它可能从情节提要/ xib文件中实例化基类时,它正在创建基类的新实例,因此它没有设置任何IBOutlet只是创建普通的空类。因此,这就是为什么您会得到tableview
为nil的错误,但没有设置错误的原因。
您没有显示如何显示addItemController
,因为这将指示用于返回到原始ViewController
的正确方法。
在稍微分开的注释上,您应该为Swift中的类和变量名使用正确的格式。因此addItemController
是一个类,因此应称为AddItemController
,在ViewController
中,tableview
应该实际上是tableView
。