【问题标题】:swift tableView is nilswift tableView 为零
【发布时间】: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()

标签: ios swift tableview


【解决方案1】:

你的错误在这一行:

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

这并不是因为你把它“转回”给你ViewController 类,但它会创建它的一个新实例并呈现它。同样,当它可能应该从storyboard/xib文件中实例化它时,它正在创建一个基本类的新实例,因此它没有设置任何IBOutlets,只是创建了普通的空类。所以这就是为什么你得到tableview 为 nil 的错误,没有任何设置。

您没有展示您如何呈现addItemController,因为这将决定使用正确的方法返回到您原来的ViewController

另外,你应该在 Swift 中使用正确的类名和变量名格式。所以addItemController 是一个类,因此应该称为AddItemController,在ViewControllertableview 应该真的是tableView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2014-11-14
    • 2016-08-12
    • 2014-11-14
    相关资源
    最近更新 更多