在其他 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"?
另请参阅:
- http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html
- What is a StoryBoard ID and how can i use this?
更新:(看到项目后)
问题是你初始化了GebieteViewController
但是你没有显示它所以tableView
是nil。这意味着 loadView
和 viewDidLoad
将不会在 targetVC
.
中执行
顺便说一句,你不需要创建一个新的GebieteViewController
,因为NewGebietViewController
是通过Modally呈现的,所以只需获取它,然后你就可以调用reloadData
存在 GebieteViewController
个实例。
要解决这个问题,只需使用这些代码:
lazy var targetVC: GebieteViewController = {
let targetVC = (self.presentingViewController as! UINavigationController).topViewController as! GebieteViewController
return targetVC
}()
我是编程新手,有一个大问题,我花了很多时间来解决它。但我不明白为什么会这样。
我有一个 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"?
另请参阅:
- http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html
- What is a StoryBoard ID and how can i use this?
更新:(看到项目后)
问题是你初始化了GebieteViewController
但是你没有显示它所以tableView
是nil。这意味着 loadView
和 viewDidLoad
将不会在 targetVC
.
顺便说一句,你不需要创建一个新的GebieteViewController
,因为NewGebietViewController
是通过Modally呈现的,所以只需获取它,然后你就可以调用reloadData
存在 GebieteViewController
个实例。
要解决这个问题,只需使用这些代码:
lazy var targetVC: GebieteViewController = {
let targetVC = (self.presentingViewController as! UINavigationController).topViewController as! GebieteViewController
return targetVC
}()