在其他 class 中重新加载数据 UITableView 后发生致命错误

fatal error after reloadData UITableView in other class

我是编程新手,有一个大问题,我花了很多时间来解决它。但我不明白为什么会这样。

我有一个 ViewController 和一个 TableView 以及另一个 ViewController,其中一个视图可以向 TableView 添加数据。从这个class我从第一个ViewController调用一个func class,在这个func中就是reloadData。问题就在这里开始了。应用程序停止,只有当我在第二个 class 中调用 func 时才会停止。当我在第一个 class 中调用它时,从来没有出现过问题。

这是第一个class:

class GebieteViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

这是函数:

func ladeDaten(){

    let request = NSFetchRequest(entityName: "Territory")
    do {
        territorys = try context.executeFetchRequest(request) as! [Territory]
    } catch let gebieteError as NSError {
        print("error: \(gebieteError.localizedDescription)")
    }
    gebieteTableView.reloadData()

}

这是第二个class:

class NewGebietViewController: UIViewController, UITextFieldDelegate, UITableViewDelegate{

这是函数:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let neuesGebiet = NSEntityDescription.insertNewObjectForEntityForName("Territory", inManagedObjectContext: self.targetVC.context) as! Territory
    neuesGebiet.territoryName = self.newGebietNameTextField.text
    do {
    try self.targetVC.context.save()
    }catch let gebieteError as NSError {
        print("error: \(gebieteError.localizedDescription)")
    }
    self.targetVC.ladeDaten()
    dismissViewControllerAnimated(true, completion: nil)
    return true
}

显示错误的图片

http://i.stack.imgur.com/qUo3e.png

感谢您的帮助。

来自第一个 class 的更多代码:

class GebieteViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

@IBOutlet weak var gebieteTableView: UITableView!
@IBOutlet weak var menuButton: UIBarButtonItem!
@IBOutlet weak var newGebietButton: DesignableButton!
var territorys: [Territory]!

来自第二个 class 的更多代码:

class NewGebietViewController: UIViewController, UITextFieldDelegate, UITableViewDelegate{

@IBOutlet weak var newGebietNameTextField: UITextField!

let targetVC = GebieteViewController()

你应该替换这一行:

let targetVC = GebieteViewController()

与:

lazy var targetVC: GebieteViewController = {
    let targetVC = self.storyboard?.instantiateViewControllerWithIdentifier("YourIdentifier") as! GebieteViewController
    return targetVC
}()

使用您在界面构建器中设置的故事板 ID 来创建和 return 视图控制器。

Where can I find the name of my "Identifier"?

另请参阅:


更新:(看到项目后)

问题是你初始化了GebieteViewController但是你没有显示它所以tableView是nil。这意味着 loadViewviewDidLoad 将不会在 targetVC.

中执行

顺便说一句,你不需要创建一个新的GebieteViewController,因为NewGebietViewController是通过Modally呈现的,所以只需获取它,然后你就可以调用reloadData存在 GebieteViewController 个实例。

要解决这个问题,只需使用这些代码:

lazy var targetVC: GebieteViewController = {
    let targetVC = (self.presentingViewController as! UINavigationController).topViewController as! GebieteViewController
    return targetVC
}()