表视图为零

Bla*_*rai 0 uitableview ios swift3

我有以下课程:

import UIKit
import CloudKit

class FirstViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var listTableView: UITableView!
    var list: TLListModel!
    var specificList: CKRecord!




    override func viewDidLoad()
    {
        super.viewDidLoad()
        let myContainer = CKContainer.default()
        list = TLListModel(container: myContainer, viewController: self)
        if(listTableView != nil){
            listTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        }

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("number of items: %i", list.lists.count)
        return list.lists.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:UITableViewCell = listTableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
        let list: CKRecord = self.list.lists[(indexPath as NSIndexPath).row]
        cell.textLabel?.text = list.value(forKey: "ListName") as? String
        cell.textLabel?.font = UIFont (name: "Slim Joe", size: 20)
        cell.accessoryType = .disclosureIndicator
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("This object has been selected")
        print(self.list.lists[(indexPath as NSIndexPath).row])

        specificList = self.list.lists[(indexPath as NSIndexPath).row]
        performSegue(withIdentifier: "TLSpecificListSegue", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "TLSpecificListSegue"{
            if let destinationVC = segue.destination as? TLSpecificListViewController{
                destinationVC.listObject = specificList
            }
        }
    }

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
    {
        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
    {
        if editingStyle == .delete
        {
            let cloudkit = TLCloudKitHelper()            
            cloudkit.deleteListItem(self.list.lists[(indexPath as NSIndexPath).row], callback: { (listName) in
                TLAlertHelper.notifyUser("List Deleted", message: NSString(format: "List for %@ successfully deleted", listName) as String, sender: self)

                 let myContainer = CKContainer.default()
                 self.list = TLListModel(container: myContainer, viewController: self)
                DispatchQueue.main.async {
                    self.listTableView.reloadData()
                }

            })


        }
    }

}
Run Code Online (Sandbox Code Playgroud)

当我使用以下方法从另一个视图控制器调用它时:

@IBAction func createListAction(_ sender: AnyObject) {
    let cloudkit = TLCloudKitHelper()
    let listArray = createListFromTextField(textInputArea.text)

    if(!(listNameTextField.text?.isEmpty)!){
        cloudkit.createList(listNameTextField.text!) { (response) in
            let listId = response
            if (!listArray.isEmpty){
                for item in listArray{
                    cloudkit.saveItemRecord(item, listId: listId, recordName: response)
                }
            }
            let fvc: FirstViewController = FirstViewController()
            DispatchQueue.main.async {
                self.present(fvc, animated: true, completion: nil)
            }

        }
    }else{
        TLAlertHelper.notifyUser("Give the list a name", message: "You need to give you list a name...", sender:self)
    }


}
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息 fatal error: unexpectedly found nil while unwrapping an Optional value

我不明白为什么我会收到这个错误。我试过在这里查看答案:Simple UITableView in Swift - 意外发现 nil但我这些答案都没有帮助。有人能告诉我为什么会崩溃以及我该如何解决吗?

mat*_*att 5

问题是这一行:

let fvc: FirstViewController = FirstViewController()
Run Code Online (Sandbox Code Playgroud)

这将创建一个空白的FirstViewController 实例——一个与您在 storyboard 中设计的界面完全无关的实例。它的观点是空的。它没有表格视图。因此,由于没有表视图,因此任何表视图都没有出口连接,并listTableView保持nil.

您想要做的是从情节提要中获取 FirstViewController 实例,您已经在情节提要中设计其界面。您可以通过与故事板交谈并使用 FirstViewController 的标识符(即 call )来做到这一点instantiateViewController(withIdentifier:)。(您可能必须放弃的FirstViewController在故事板用于此目的的标识符。)

编辑这是一个很常见的错误,我写了一篇关于它的博客文章:http : //www.programmingios.net/dont-make-a-new-instance-by-mistake/