TableView是Nil

时间:2016-10-17 01:59:36

标签: ios uitableview 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()
                }

            })


        }
    }

}

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

@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)
    }


}

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

我不明白为什么我会收到此错误。我试着在这里查看答案:Simple UITableView in Swift - unexpectedly found nil但我没有一个答案有帮助。有人能告诉我为什么这次崩溃以及我如何解决它?

1 个答案:

答案 0 :(得分:3)

问题在于这一行:

let fvc: FirstViewController = FirstViewController()

这将创建一个空白 FirstViewController实例 - 一个与故事板中设计的界面完全不相关的实例。它的视图是为空。它没有表格视图。因此,由于没有表格视图,因此任何表格视图都没有出口连接,listTableView仍为nil

您要做的是从故事板中获取FirstViewController实例 ,即已在故事板中设计的界面。您可以通过将与故事板交谈并使用FirstViewController的标识符来实现,即调用instantiateViewController(withIdentifier:)。 (您可能必须在故事板中为提供 FirstViewController作为此目的的标识符。)