swift tableView为零

时间:2018-10-10 18:23:24

标签: ios swift tableview

因此,每当我在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

1 个答案:

答案 0 :(得分:0)

您在此行中出错:

self.present(ViewController(), animated: true, completion: nil)

这与您将其“返回”到您的ViewController类中不同,但是它创建了它的新实例并将其呈现。同样,当它可能从情节提要/ xib文件中实例化基类时,它正在创建基类的新实例,因此它没有设置任何IBOutlet只是创建普通的空类。因此,这就是为什么您会得到tableview为nil的错误,但没有设置错误的原因。

您没有显示如何显示addItemController,因为这将指示用于返回到原始ViewController的正确方法。

在稍微分开的注释上,您应该为Swift中的类和变量名使用正确的格式。因此addItemController是一个类,因此应称为AddItemController,在ViewController中,tableview应该实际上是tableView